отформатировать число с запятыми и десятичными знаками в С# (asp.net MVC3)

Мне нужно отобразить число с запятыми и десятичной точкой.

Например: Случай 1: Десятичное число – 432 324 (без запятых и десятичных точек). Необходимо отображать его как 432 324,00
, но не как 432 324.

Случай 2. Десятичное число – 2 222 222,22 (без запятых). Необходимо отобразить его как 2 222 222,22.

Я пробовал ToString("#,##0.##"). Но это не форматирование


person Krishan    schedule 16.04.2013    source источник
comment
Когда вы говорите, что это не работает, что на самом деле делает string.Format?   -  person Tomas McGuinness    schedule 16.04.2013
comment
я не пробовал метод string.Format, и мне кажется, что использовать форматирование tostring легко   -  person Krishan    schedule 16.04.2013
comment
Я действительно не понимаю ваши примеры, что это за форматирование? (Или это только я)   -  person V4Vendetta    schedule 16.04.2013
comment
Что говорит @tomasmcguinness, какой результат вы получаете, если он не работает? Если вы действительно хотите отформатировать 123456789 как 34,94,30,94,32,324,00, то вы далеки от этого.   -  person John Willemse    schedule 16.04.2013
comment
LOL, так каков результат вашего форматирования ToString? Если вы хотите, чтобы 123456789 отображалось как 34,94,30,94,32,324.00 : Есть ли здесь какая-то магическая логика, которую мог понять только волшебник из страны Оз? :D   -  person Paul Zahra    schedule 16.04.2013
comment
Для людей, которые ищут случай, когда он игнорирует .00, только если это .00, это: {0:#,0.##}   -  person Worthy7    schedule 04.10.2016


Ответы (10)


int number = 1234567890;
Convert.ToDecimal(number).ToString("#,##0.00");

Вы получите результат 1,234,567,890.00.

person Roys    schedule 21.06.2013
comment
в модели это похоже на публичную десятичную сумму Amount{get;set;} , когда я использую для ввода в базу данных значение 29.1234, я получаю результат в представлении 29.12, даже если я меняю десятичную базу данных (18,4), которая была (18,2), но все же я получаю значение вроде 29.1200, но мне нужно точное значение без каких-либо изменений, возможно ли это - person SAR; 12.12.2016
comment
какого черта, этот ответ принят ?? это дает мне 1 234 567 890,00 - person Toolkit; 26.08.2017
comment
Нет необходимости в Convert.ToDecimal, когда number.ToString("#,##0.00") дает тот же результат. - person Jeppe Stig Nielsen; 04.07.2020
comment
@Toolkit Текущая культура потока определяет, какие разделители использовать. В вашей культуре используются пробелы. Вы можете использовать перегрузку .ToString, которая принимает дополнительный аргумент, а именно поставщика формата. Для поставщика формата вы можете передать культуру, например CultureInfo.InvariantCulture или, например, CultureInfo.GetCultureInfo("en-US"). Или вы можете передать экземпляр NumberFormatInfo. - person Jeppe Stig Nielsen; 04.07.2020

Возможно, вам просто нужна стандартная строка формата "N", как в

number.ToString("N")

Он будет использовать разделители тысяч и фиксированное количество дробных десятичных знаков. Символ для разделителей тысяч и символ десятичной точки зависят от поставщика формата (обычно CultureInfo), который вы используете, как и количество десятичных знаков (которое обычно равно 2, как вам требуется).

Если поставщик формата указывает другое количество десятичных знаков и если вы не хотите менять поставщика формата, вы можете указать количество десятичных знаков после N, как в .ToString("N2").

Изменить: размеры групп между запятыми регулируются

CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes

массив, если вы не укажете поставщика специального формата.

person Jeppe Stig Nielsen    schedule 16.04.2013

У меня такая же проблема. Я хотел отформатировать числа как общий формат в электронных таблицах, то есть показывать десятичные дроби, если они значимы, но обрезать их, если нет. Другими словами:

1234.56 => 1,234.56

1234 => 1,234

Он должен поддерживать максимальное количество знаков после запятой, но не ставить нули или точки в конце, если это не требуется, и, конечно же, он должен соответствовать культурным особенностям. Я так и не придумал чистого способа сделать это, используя String.Format отдельно, но и комбинация String.Format и Regex.Replace с некоторой помощью по культуре от NumberFormatInfo.CurrentInfo выполнил задание (программа LinqPad C#).

string FormatNumber<T>(T number, int maxDecimals = 4) {
    return Regex.Replace(String.Format("{0:n" + maxDecimals + "}", number),
                         @"[" + System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator + "]?0+$", "");
}   

void Main(){
    foreach (var test in new[] { 123, 1234, 1234.56, 123456.789, 1234.56789123 } )
        Console.WriteLine(test + " = " + FormatNumber(test));
}

Производит:

123 = 123
1234 = 1,234
1234.56 = 1,234.56
123456.789 = 123,456.789
1234.56789123 = 1,234.5679
person Wade Hatler    schedule 21.12.2014
comment
Это лучший ответ, который я лично видел. Я использую слегка измененную версию этого в методе расширения. Прекрасная работа! - person Tyler Kalosza; 09.10.2019

Попробуйте с

ToString("#,##0.00")

Из MSDN

* Описатель пользовательского формата "0" служит символом нулевого заполнителя. Если форматируемое значение содержит цифру в позиции нуля в строке форматирования, эта цифра копируется в результирующую строку; в противном случае в строке результата появляется ноль. Положение крайнего левого нуля перед десятичной запятой и крайнего правого нуля после запятой определяет диапазон цифр, которые всегда присутствуют в строке результата.

Спецификатор "00" приводит к округлению значения до ближайшего разряда, предшествующего десятичной дроби, где всегда используется округление от нуля. Например, форматирование 34,5 с помощью «00» приведет к значению 35.*

person Patrick D'Souza    schedule 16.04.2013

Для Razor View:

[email protected]("{0:#,0.00}",item.TotalAmount)
person JoshYates1980    schedule 22.07.2015

Попробуйте с

ToString("#,##0.###")

Производит:

1234.55678 => 1,234.556

1234 => 1,234

person Abolfazl Rastgou    schedule 14.02.2018
comment
Это сладкое решение. - person MDM; 09.11.2018
comment
Это не то, что он просил, но это именно то, что мне было нужно. - person Guy Biber; 08.11.2019

Ваш вопрос не очень ясен, но это должно достичь того, что вы пытаетесь сделать:

decimal numericValue = 3494309432324.00m;
string formatted = numericValue.ToString("#,##0.00");

Тогда formatted будет содержать: 3 494 309 432 324,00

person Belogix    schedule 16.04.2013

Все, что нужно, это "#,0.00", С# сделает все остальное.

Num.ToString("#,0.00"")

  • "#,0" форматирует разделители тысяч.
  • "0.00" устанавливает два десятичных знака
person Matt Welson    schedule 20.01.2014

Если вы используете строковые переменные, вы можете отформатировать строку напрямую, используя :, а затем указать формат (например, N0, P2 и т. д.).

decimal Number = 2000.55512016465m;
$"{Number:N}" #Outputs 2,000.55512016465

Вы также можете указать количество отображаемых десятичных знаков, добавив число в конце, например

$"{Number:N1}" #Outputs 2,000.5
$"{Number:N2}" #Outputs 2,000.55
$"{Number:N3}" #Outputs 2,000.555
$"{Number:N4}" #Outputs 2,000.5551
person Suit Boy Apps    schedule 14.03.2019

person    schedule
comment
CultureInfo us = new CultureInfo(en-US) сделал это за меня - person Toolkit; 26.08.2017