2012-06-04 2 views
0

내가 이런 속성을 가지는 XML 노드를 두 배로 변환 할 수 없습니다 :XE2의 XML 속성은

<pad name="E" x="2.5" y="7" drill="1.3"/> 

나는 결과를 얻을 이중으로 Attributes["x"]를 할당 25,하지 2.5 그러나 불만없이 또는 오류.

올바른 변환을 얻으려면 먼저 속성을 문자열에 할당하고 십진수 '.'를 대체해야합니다. 십진수 '로 변환 한 다음 문자열을 double로 변환합니다. 분명히 Attribute["x"]은 변환 할 수 없지만 아무 말도하지 않습니다!

String sd = XMLNode->Attributes["x"]; 
if (sd.Pos(".")) sd[sd.Pos(".")] = ','; 
double x = sd.ToDouble(); 

이 : 주위에 내 작품이 여기이 25 대신 2.5의 결함 X를 제공

double x = XMLNode->Attributes["x"]; 

과 : (?!? 버그) 여기

에 결함이 변환을 코드입니다 x (2.5)에서 올바른 값을 제공합니다.

더 간단한 방법이 있어야합니다! 당신은 IDE의 XML 데이터 바인딩 마법사와 같은 데이터를 coherce하는 XSD를 사용하지 않는 경우

// 감사합니다

답변

1

XML 속성은 임의의 문자열 값입니다. Attributes[] 속성은 OleVariant을 반환합니다.이 경우에는 System::String이 포함될 것입니다. System::StringOleVariantdouble 변환 연산자 또는 String::ToDouble() 방법을 사용하여 double로 변환하는 경우, 변환은 분명히 대신 소수 구분 기호로 , 문자를 사용하는 PC의 로케일 설정을 사용하여 초기화 글로벌 SysUtils::DecimalSeparator 변수를 사용 문자는 .입니다. XML은 로케일 설정을 알 수있는 방법이 없습니다.

최신 버전의 C++ Builder를 사용하고 있으므로 TFormatSettings 레코드를 입력으로 전달할 수있는 오버로드 된 StrToFloat() 함수 버전을 사용할 수 있습니다. 그런 다음 을 TFormatSettings::DecimalSeparator으로 변환하여 사용할 수 있습니다 (예 :

).
TFormatSettings fmt = TFormatSettings::Create(); 
fmt.DecimalSeparator = '.'; 
double x = StrToFloat(XMLNode->Attributes["x"], fmt);