0

次のような属性を持つ XML ノードがあります。

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

を doubleに代入するとAttributes["x"]、結果は 2.5 ではなく 25 になりますが、苦情やエラーは発生しません。

正しい変換を得るには、最初に属性を文字列に割り当て、小数点以下を置き換える必要があります '.' を 10 進数の ',' に変換してから、文字列を double に変換します。が変換できないことは明らかですが、Attribute["x"]何も言いません! (バグ?!?)

変換に失敗したコードは次のとおりです。

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

これにより、2.5 ではなく 25 の誤った x が得られます。これが私の回避策です。

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

これにより、x (2.5) の正しい値が得られます。

これを行うには、もっと簡単な方法が必要です。

// ありがとう

4

1 に答える 1

1

IDE の XML データ バインディング ウィザードなど、XSD を使用してデータを結合していない場合、XML 属性は任意の文字列値になります。Attributes[]プロパティは を返します。OleVariantこの場合、これには が含まれますSystem::String。aSystem::Stringがの変換演算子またはメソッドdoubleを使用して a に変換される場合、変換ではグローバル変数が使用されます。このグローバル変数は、PC のロケール設定を使用して初期化されます。これは、文字の代わりに小数点記号として明らかに文字を使用しています。XML には、そのロケール設定を知る方法がありません。OleVariantdoubleString::ToDouble()SysUtils::DecimalSeparator,.

C++Builder の最新バージョンを使用しているため、オーバーロードされたバージョンの関数を使用して、レコードを入力としてStrToFloat()渡すことができます。次に、変換に使用するとしてTFormatSettings指定できます。たとえば、次のようになります。.TFormatSettings::DecimalSeparator

TFormatSettings fmt = TFormatSettings::Create();
fmt.DecimalSeparator = '.';
double x = StrToFloat(XMLNode->Attributes["x"], fmt); 
于 2012-06-05T01:29:10.457 に答える