Как я могу преобразовать ценности последовательности в форматах "1.123" и "1,123", чтобы удвоиться синглом дважды. TryParse?

I have an incoming source of string values representing double values with "." and "," delimiter and my program would run on PCs with different settings of delimiter ("," or ",")
Which way can I convert it with single line without trying first convert ".", then if fail, try ","?
I tried some combinations like that:

    string dot_val = "1.12";
    string non_dot_val = "1,12";

    double dot_double = 0, non_dot_double = 0;

    bool dot_res = double.TryParse(dot_val, NumberStyles.Any, CultureInfo.CurrentCulture, out dot_double);
    bool non_dot_res = double.TryParse(non_dot_val, NumberStyles.Number | NumberStyles.AllowCurrencySymbol, CultureInfo.CurrentCulture, out non_dot_double);

But one of the attempts to convert is always fail.
If tell it shortly, I need an universal function to convert "." or "," delimited double values into double

1
это потерпит неудачу, если параметры настройки PC установили, который разделитель,
добавлено автор Kosmos, источник
Как насчет dot_val = not_dot_val. Замените (' ' '.'); ?
добавлено автор Nolonar, источник
Основная проблема здесь состоит в том, что данные неоднозначны. 1,123 может означать 1123 (одна тысяча, сто двадцать три) или 1.123 (один пункт один два три), в зависимости от того, в какой культуре вы интерпретируете его. То же самое идет для 1.123. Это будет означать 1123 на немецком и большинстве других европейских культур, но это будет означать 1.123 на английском языке.
добавлено автор Daniel Hilgarth, источник
Тогда получите разделитель от урегулирования PC и замените как not_dot_val. Замените (' ' Разделитель PC)
добавлено автор Igoy, источник

2 ответы

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

public double UniveralParse(string value)
{
    double result;

   //If we can not parse the "." format...
    if (!double.TryParse(value, NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result))
       //And also can not parse the "," format...
        if (!double.TryParse(value, NumberStyles.Any, CultureInfo.GetCultureInfo("de-DE"), out result))
           //we throw an exception
            throw new ArgumentException("value is not in expected format!");

   //Otherwise we can return the value
    return result;
}
2
добавлено
Я искал единственную линию путь: P Без многого проверяет то, что потерпело неудачу и что нет. Я должен преобразовать многое из этого, оценивает и должен сделать это быстро
добавлено автор Kosmos, источник
Спасибо за ответ:)
добавлено автор Kosmos, источник
@PhilippeLeybaert: You' право ре! Я didn' t понимают это сначала...
добавлено автор Thorsten Dittmar, источник
Если только люди прокомментировали бы почему они downvote...
добавлено автор Thorsten Dittmar, источник
Это потерпит неудачу для "100,000" или "1,123", если число, как предполагалось, было 100 или 1.123
добавлено автор Philippe Leybaert, источник

Самый легкий путь состоит в том, чтобы заменить'', '.' и разбирают результат, используя инвариантное урегулирование культуры:

double.TryParse(
          dot_val.Replace(',','.'), 
          NumberStyles.Any, 
          CultureInfo.InvariantCulture, 
          out dot_double);

Единственное ограничение этого - то, что у вас не должно быть группировки в вашем числе (как 123,000.45)

1
добавлено
так как я не планирую дать ему ценности как "123,000.45", я думаю it' s хороший: P Спасибо!
добавлено автор Kosmos, источник
Это, что так? Что, если я дал вам это: 1,000.50?
добавлено автор Thorsten Dittmar, источник
You' право ре! Я didn' t думают об этом сначала...
добавлено автор Thorsten Dittmar, источник
That' s не фактический вариант использования OP, но you' право ре. У вашего решения есть та же самая проблема хотя:)
добавлено автор Philippe Leybaert, источник
Ваше решение терпит неудачу для 1,234. Получающееся число будет 1234
добавлено автор Philippe Leybaert, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot