строка с двойной ошибкой разбора - PullRequest
0 голосов
/ 25 мая 2011

У меня есть следующий код:

    static void Main(string[] args)
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo("mk-MK");
        string s2 = "4.434,00";

        double d;

        if (Double.TryParse(s2, NumberStyles.Number, CultureInfo.CurrentCulture, out d))
        {
            //String.Format("{0:0.0,00}", d);
            Console.WriteLine(d + " Type of: " + d.GetType());
        }
        else
        {
            Console.WriteLine("ne go parsirashe");
        }

        String.Format("{0:0.0,00}", d);
        Console.WriteLine(d);


        //Console.WriteLine(String.Format("{0:0,0.00}", d));


        //Console.WriteLine(s2.GetType().ToString());
        //Console.ReadLine();

        //String.Format("{0:0.0,00}"
        Console.ReadLine();

Вывод: 4434 Тип: System.Double 4434

Почему значение d не в формате: 4.434,00? Можете ли вы помочь мне с этим? Я отправил пару часов, пытаясь понять это, прежде чем пытаться связаться с вами, ребята. Спасибо !!!

Ответы [ 3 ]

1 голос
/ 25 мая 2011

Вы хотели сделать:

string formatted = String.Format("{0:0.0,00}", d);
Console.WriteLine(formatted);

string.Format возвращает строку - это не может повлиять на форматирование double, так как двойники вообще не имеют форматирования. Doubles сохраняет только необработанное числовое значение (как биты, внутри).

1 голос
/ 25 мая 2011

У вас есть . и , в неправильном направлении, если я понимаю, что вы пытаетесь сделать.

Если вы читаете Пользовательские строки числового формата на странице MSDN вы можете видеть, что вам нужно использовать , для разделителя тысяч и . для десятичного разделителя, и (важная часть) целевая культура здесь не имеет значения .Формат всегда один и тот же, независимо от текущей культуры.

Итак, что вы хотите использовать:

Console.WriteLine("{0:0,0.00}", d);

Тогда вывод:

4434 Type of: System.Double
4.434,00
1 голос
/ 25 мая 2011

Вы отбрасываете отформатированную строку - вы не присваиваете ее строке и просто выводите double на консоль (что вызовет ToString() для нее).

Попробуйте это:

string forDisplay = string.Format("{0:0.0,00}", d);
Console.WriteLine(forDisplay);

Или еще короче:

Console.WriteLine(string.Format("{0:0.0,00}", d));

Обновление:

Чтобы отформатировать строку в соответствии с вашей культурой, вам нужно будет использовать Format перегрузка , которая принимает IFormatProvider (то есть культуру) и гарантирует, что в строке формата используются правильные символы для разных частей (, для стандарт разделитель тысяч и . для стандартный десятичный разделитель - см. здесь значения каждого такого символа в строке формата):

var res = String.Format(CultureInfo.CurrentCulture, "{0:0,0.00}", d);
Console.WriteLine(forDisplay);

Результат:

4.434,00
...