Разбор двойной с точкой до запятой - PullRequest
0 голосов
/ 16 октября 2019

Я работаю с двойниками. В Нидерландах мы используем 51,3 вместо 51,3. Я написал фрагмент кода, который работает с точками вместо запятых. Но результат ранее написанного кода возвращает двойной английский способ с точкой. Я сталкиваюсь с некоторыми странными ошибками.

Вот что у меня есть:

var calResult = 15.2d;
var calResultString = calResult.ToString(CultureInfo.GetCultureInfo("nl-NL"));
var result = double.Parse(calResultString);
  1. calResult == "15,2" -> как и ожидалось
  2. calResultString =="15,2" -> как и ожидалось
  3. result == "152" -> здесь я ожидаю запятую.

A также попытался добавить cultureinfo также в двойном.Parse. В результате получилось «15,2».

TLDR: мне нужно конвертировать английский / американский двойной в голландский (или аналогичные правила).

Заранее спасибо! :)

PS

Надеюсь, это не дублирующий вопрос, но не нашел ничего такого конкретного.

Ответы [ 4 ]

3 голосов
/ 16 октября 2019

Вы, вероятно, должны либо предоставить "nl-NL" всякий раз, когда вы работаете с культурой Нидерландов

  var calResult = 15.2d;
  var calResultString = calResult.ToString(CultureInfo.GetCultureInfo("nl-NL"));
  // We should parse with "nl-NL", not with CurrentCulture which seems to be "en-US"
  var result = double.Parse(calResultString, CultureInfo.GetCultureInfo("nl-NL")); 

, либо указать CurrentCulture (культура по умолчанию)

  CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("nl-NL");

  var calResult = 15.2d;
  // now CultureInfo.GetCultureInfo("nl-NL") is redundant 
  var calResultString = calResult.ToString(); 
  var result = double.Parse(calResultString); 

Наконец, еслиу вас есть string, который представляет некоторое значение с плавающей запятой в en-US культуре, и вы хотите такое же значение , но быть string в nl-NL формате:

  string source = "123.456";

  string result = double
    .Parse(source, CultureInfo.GetCultureInfo("en-US"))
    .ToString(CultureInfo.GetCultureInfo("nl-NL")); 
1 голос
/ 16 октября 2019

Числа и строки не содержат никакой информации о культуре, вместо этого вы указываете культуру при преобразовании чисел в строки.

result == "152" -> здесь я ожидаю запятую

Произошло то, что вы попросили операционную систему разобрать «15,2» в двойное число и не указали культуру. По умолчанию он был принят в культуре США и игнорировал запятую.

Если бы вы указали культуру:

var result = double.Parse(calResultString, CultureInfo.GetCultureInfo("nl-NL"));

, это дало бы вам правильное значение (15.2), и это могло бы даже иметьотображается как 15,2, если ваш компьютер настроен на правильный числовой формат (и отладчик использовал ваши предпочтения).

В идеале вы не жестко программируете культуру, а используете культуру, которую использует пользовательвыбран.

0 голосов
/ 16 октября 2019
 var calResult = 15.2d;
 var calResultString = calResult.ToString();

string result = double.Parse(calResultString).ToString(CultureInfo.GetCultureInfo("nl-NL"));
0 голосов
/ 16 октября 2019

Я написал простой метод, который проверит наличие символа комы на вашем входе и заменит его точкой. Я считаю, что лучший способ - это принять значение как string. таким образом, вы можете манипулировать им, а затем можете анализировать его и возвращать двойное или строковое значение, если хотите:

    var input = Console.ReadLine();
    double parsedDouble;
    if (input.Contains(","))
    {
        input = input.ToString().Replace(",", ".");
    }
    if (!Double.TryParse(input, out parsedDouble))
    {
        Console.WriteLine("Error parsing input");
    }
    else
    {
        Console.WriteLine(parsedDouble);
    }

    Console.ReadLine();

редактировать: ответы от Робина Беннетта / Дмитрия Быченко намного лучше, чем у меня, как у меняпросто больше ручного. Я не знал о перегрузке parse, которую он предоставил. Я оставлю свое решение, потому что оно решает эту проблему, даже если оно немного более ... грубое;)

...