none
Помогите тупому с переводом строковых в цифровые переменные... RRS feed

  • Вопрос

  • Как перевести стринговые значения с разделителем (независимо будь то "," или ".") нормально в цифры? К примеру воодим в консоли число : 22,1 и выводиться квадрат числа, вводим мы число 22.1 и он опять таки выводит квадрат числа! Есть способы без ручного указания разделителей таких как точка и запятая? Какие есть вообще способы... поделитесь- а то я так с обучением языка СИ#  и не сдвинусь с места дальше!:) Спс заранее
    29 октября 2011 г. 18:43

Ответы

  • goo0
    >можно ввести и 1000,001 и 1000.001 одинаково посчитает
    Да можно то можно. Дело в том, что так делать нельзя. Один юзер будет под точкой понимать разделитель дробной части, другой юзер будет думать что это разделитель тысячных знаков. А автоматически понять что этот знак обозначает - нельзя. Поэтому фреймворк и не содержит "универсальной" функции парсинга точки и запятой.
    Malobukv, вашу бы энергию, да в мирное русло :)
    • Помечено в качестве ответа Abolmasov Dmitry 11 ноября 2011 г. 5:48
    30 октября 2011 г. 17:58
    Отвечающий
  • > можно ввести и 1000,001 и 1000.001 одинаково посчитает!

     
    да, если сделать так:
    Func<string, decimal> fn = str =>
    {
        var ci = new System.Globalization.CultureInfo("ru-ru");
        var sps = new[] { ',', '.' };
        var sp1 = str.IndexOfAny(sps);
        var sp2 = str.LastIndexOfAny(sps);
        ci.NumberFormat.NumberDecimalSeparator = str.Substring(sp2, 1);
        if(sp1 != sp2)
            ci.NumberFormat.NumberGroupSeparator = str.Substring(sp1, 1);
        return Convert.ToDecimal(str, ci);
    };
    
    var v1 = fn("1.000,001");
    var v2 = fn("1,000.001");
    var v3 = fn("1000,001");
    var v4 = fn("1000.001");
    


    • Предложено в качестве ответа Malobukv 30 октября 2011 г. 16:22
    • Помечено в качестве ответа Abolmasov Dmitry 11 ноября 2011 г. 5:48
    30 октября 2011 г. 16:21

Все ответы

  • > Как перевести стринговые значения с разделителем (независимо будь то "," или ".") нормально в цифры?
     

    using System;
    using System.Globalization;
    ...
    var v1 = Convert.ToDecimal("22,1", CultureInfo.GetCultureInfo("ru-ru"));
    var v2 = Convert.ToDecimal("22.1", CultureInfo.GetCultureInfo("en-us"));
    var v3 = Convert.ToDecimal("22,1".Replace(',', '.'), CultureInfo.GetCultureInfo("en-us"));

    • Предложено в качестве ответа Malobukv 29 октября 2011 г. 19:42
    29 октября 2011 г. 19:35
  • Ну такой вариант у меня был в запасе! Неужели у глобализатион нету ничего что просто определяет любой разделитель дробной части?

    30 октября 2011 г. 5:50
  • Вот пример (корректный!) числа:

    1.000,000

    Можете однозначно сказать какой здесь разделитель дробной части? Вот и Convert тоже не может.

    30 октября 2011 г. 9:01
    Отвечающий
  • Я могу!:) Слева делитель тысяч, справа делитель дробной части! Вроде все понятно! И как это разобрать я знаю, а вот банальный ввод любого делителя дробной части... это для меня сложно, ну кто как бы написал программу... вводите число с делителем и оно обрабатывается как число!? Неужели один вариант только?!
    30 октября 2011 г. 10:34
  • Я могу!:) Слева делитель тысяч, справа делитель дробной части! Вроде все понятно!


    Ок, а такое:

    1.000

    ?

    30 октября 2011 г. 15:08
    Отвечающий
  • Ну а тут пример приведен выше... просто параметры глобализатион енглиш и все, неужели нет общего?:) Или я туплю... проще если выскажу свой вопрос: напишите программу чтобы вводя в консоли число с разделителем оно было возведено к примеру в квадрат и выведено опять же в консоль... а там посмотрим  и сравним... любой метод парсы, конверты если хотите и другие возможные... Ну помогите пжалуйста, неужели никто не писал такого?
    30 октября 2011 г. 15:18
  • > Вот пример (корректный!) числа: 1.000,000 Можете однозначно сказать какой здесь разделитель дробной части? Вот и Convert тоже не может.

     
    можно указать разделители
     
    var ci = new System.Globalization.CultureInfo("ru-ru");
    ci.NumberFormat.NumberDecimalSeparator = ",";
    ci.NumberFormat.NumberGroupSeparator = ".";
    var res = Convert.ToDecimal("1.000,001", ci);
    

     
    var ci = new System.Globalization.CultureInfo("ru-ru");
    ci.NumberFormat.NumberDecimalSeparator = "делитель дробной части";
    ci.NumberFormat.NumberGroupSeparator = "делитель тысяч";
    var res = Convert.ToDecimal("1делитель тысяч000делитель дробной части001", ci);




    • Предложено в качестве ответа Malobukv 30 октября 2011 г. 15:52
    • Изменено Malobukv 30 октября 2011 г. 17:11
    30 октября 2011 г. 15:47
  • Ы!:) похож на прмер с библиотеки мсдна!:) только вот я имел ввиду что ci можно ввести и 1000,001 и 1000.001 одинаково посчитает!:) про делители тысяч я пока молчу...
    30 октября 2011 г. 15:57
  • > я имел ввиду что ci можно ввести и 1000,001 и 1000.001 одинаково посчитает!:)


    о такой ситуации см. выше var v3 = ...; 
    перед вызовом Convert.ToDecimal можно убрать/заменить разделители.
     
    P.S.
    если интересно как происходит парсинг, то можно открыть сборку mscorlib.dll с помощью reflector или ilspy и посмотреть на реализацию метода Convert.ToDecimal
    30 октября 2011 г. 16:11
  • > можно ввести и 1000,001 и 1000.001 одинаково посчитает!

     
    да, если сделать так:
    Func<string, decimal> fn = str =>
    {
        var ci = new System.Globalization.CultureInfo("ru-ru");
        var sps = new[] { ',', '.' };
        var sp1 = str.IndexOfAny(sps);
        var sp2 = str.LastIndexOfAny(sps);
        ci.NumberFormat.NumberDecimalSeparator = str.Substring(sp2, 1);
        if(sp1 != sp2)
            ci.NumberFormat.NumberGroupSeparator = str.Substring(sp1, 1);
        return Convert.ToDecimal(str, ci);
    };
    
    var v1 = fn("1.000,001");
    var v2 = fn("1,000.001");
    var v3 = fn("1000,001");
    var v4 = fn("1000.001");
    


    • Предложено в качестве ответа Malobukv 30 октября 2011 г. 16:22
    • Помечено в качестве ответа Abolmasov Dmitry 11 ноября 2011 г. 5:48
    30 октября 2011 г. 16:21
  • Воот, спасибо... о таком варианте я не подумал, а нет меньше затрат в писанине?:) Я просто думал есть какаянибудь функция попроще!

    ПС парсинг я учил!:)

    30 октября 2011 г. 16:37
  • goo0
    >можно ввести и 1000,001 и 1000.001 одинаково посчитает
    Да можно то можно. Дело в том, что так делать нельзя. Один юзер будет под точкой понимать разделитель дробной части, другой юзер будет думать что это разделитель тысячных знаков. А автоматически понять что этот знак обозначает - нельзя. Поэтому фреймворк и не содержит "универсальной" функции парсинга точки и запятой.
    Malobukv, вашу бы энергию, да в мирное русло :)
    • Помечено в качестве ответа Abolmasov Dmitry 11 ноября 2011 г. 5:48
    30 октября 2011 г. 17:58
    Отвечающий
  • Иногда тысячи разделяются пробелом.
    31 октября 2011 г. 11:46
    Отвечающий
  • Уважаемый пользователь, пожалуйста, не забудьте отметить сообщение или сообщения, которые являются решением вашей проблемы, даже если это ваше собстевенное сообщение. Это можно сделать с помощью кнопки 'Пометить как ответ', которая есть под каждым сообщением.

    Спасибо.


    Для связи [mail]
    1 ноября 2011 г. 9:01
  • Ну я думал, может еще кто-нибудь что скажет, ответы не порадовали меня, но есть решения конечно, но не те которые я ожидал... можно недельку подождать.

    1 ноября 2011 г. 17:52
  • Если вам так хочется сделать чтобы и с точкой работало и с запятой, то почему бы просто после считывания значения не сделать String.Replace() и заменить запятую на точку (или наоборот в зависимости от культуры). А потом полученную строку уже переводить в число.

    Но как уже сказал Algol36, так делать неправильно и так делать нельзя.


    Для связи [mail]
    2 ноября 2011 г. 6:03