Какие числовые <-> строковые преобразования всегда согласованы, независимо от настроек локализации? - PullRequest
0 голосов
/ 29 июля 2010

У меня есть некоторые проблемы с преобразованием чисел <-> строк, которые я не могу разобрать.

Мы написали платформу сериализации, которая использует несколько методов сериализации xml. Но я видел некоторые несовместимые преобразования чисел в сгенерированном выводе:

с помощью:

var c = TypeDescriptor.GetConverter(double);
var s = c.ConvertToString(value);

и

var c = TypeDescriptor.GetConverter(double);
return c.ConvertFromString(value.Value);

Я получаю строки с разделителями-запятыми, такими как 3,33, и преобразованием обратно в удвоение, но будет ли преобразование обратно в удвоение работать и в другой стране, где точка используется как разделитель? (Я в Германии, мы используем запятую, но, кроме того, я хочу разделитель точек)

Затем в другой части кода я конвертирую двойные числа в некоторых структурах напрямую, добавляя его в XElement:

data.Add(new XElement("x", vector.x));

Конструктор XElement преобразует значение типа double в строку с точкой, например «3.33».

Становится очень странно, когда я хочу преобразовать эту строку обратно в двойную:

Double.TryParse(item.Value, out value.x);

и

value.x = Convert.ToDouble(item.Value);

оба игнорируют точку, и у меня двойное значение 333!?

, поэтому я попробовал это там также с кодом TypeConverter, но это дает мне исключение, что «3.33» не является допустимой строкой для двойного преобразователя ...

Теперь мне действительно нужно преобразование числа <->, которое всегда использует разделитель точек, а также анализирует его правильно, независимо от настроек культуры / локализации ...

я потерян .. что мне использовать? я даже пробовал такие вещи, как:

    NumberFormatInfo provider = new NumberFormatInfo();

    provider.NumberDecimalSeparator = ".";
    provider.NumberGroupSeparator = " ";
    provider.NumberGroupSizes = new int[] { 3 };

    foreach (var item in CultureInfo.GetCultures(CultureTypes.AllCultures))
    {
        item.NumberFormat = provider;
    }

но это не помогло .. спасибо за любую подсказку ..

Ответы [ 2 ]

3 голосов
/ 29 июля 2010

Пример того, как «исправить» эту проблему. Предполагая, что это оригинал:

double ParseString(string s)
{
     return double.Parse(s);
}

это один тип исправления

double ParseString(string s)
{
     return double.Parse(s, CultureInfo.InvariantCulture);
}

вот еще один, который вы можете использовать, если у вас есть большое количество Parses ()

double ParseString(string s)
{
     // Save off previous culture and switch to invariant for serialization.
     CultureInfo previousCulture = Thread.CurrentThread.CurrentCulture;
     Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

     double result = double.Parse(s, CultureInfo.InvariantCulture);

     Thread.CurrentThread.CurrentCulture = previousCulture;

     return result;
}
2 голосов
/ 29 июля 2010

Требуется инвариантная культура: CultureInfo.InvariantCulture.

НТН

...