Отформатировать десятичное число с символом валюты и без конечных нулей?

Текущая культура "fr-FR" (уже установлена ​​в приложении)

decimal amount = 20m;

var formattedCurrency = string.Format(Thread.CurrentThread.CurrentCulture, "{0:C}", amount);

Это дает мне 20,00 €

как удалить нули в конце?

  1. Примечание: если сумма 20,01, то на выходе должно быть 20,01 €.
  2. Если сумма 20.00, то на выходе должно быть 20 €

РЕДАКТИРОВАТЬ:

Я попытался использовать G29 для удаления завершающих нулей, но потерял символ валюты. :(


person now he who must not be named.    schedule 01.07.2014    source источник
comment
@DanielCook, но 20.01 будет 20, а не 20.01   -  person Bharadwaj    schedule 01.07.2014
comment
@DanielCook: Да, это округляет. Я не хочу, чтобы число округлялось, а просто хочу удалить из него конечные нули.   -  person now he who must not be named.    schedule 01.07.2014
comment
нет, {0:C0} не работает dotnetfiddle.net/F3cJmu   -  person Rachit Patel    schedule 01.07.2014
comment
Хотите 20,1 € за 20,1?   -  person Daniel    schedule 01.07.2014
comment
@DanielCook: Да. Точно. Без округления, но с сохранением символа валюты.   -  person now he who must not be named.    schedule 01.07.2014
comment
если у вас есть время, проверьте мой код/скрипку   -  person Rachit Patel    schedule 01.07.2014


Ответы (3)


Это будет работать:

string.Format(Thread.CurrentThread.CurrentCulture, "{0:#.##}", amount) + " " + Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol

Если вам нужно знать, где должен появиться символ валюты, это становится немного сложнее, но этого может быть достаточно (в зависимости от вашей ситуации).

Дело в том, что вы не можете указать условные цифры для формата валюты, и есть веские причины, по которым вы не должны этого делать!

Дело в том, что 20 теряет значащие цифры больше 20.00, поэтому клиент не знает, округлено ли оно на 20.01 в меньшую сторону или на 20.00 в меньшую сторону. Я бы использовал {0:C}, если только у меня нет веской причины не делать этого.

person Davio    schedule 01.07.2014
comment
Хороший ответ. Но символ валюты может быть помещен до или после значения суммы в зависимости от культуры. Например. $20 вместо US, но то же самое €20 в FR - person now he who must not be named.; 01.07.2014
comment
Именно то, что мой комментарий к моему ответу был предназначен - person Aymeric; 01.07.2014
comment
Вы можете использовать msdn.microsoft.com/en-us /library/ для размещения символа валюты, но я хотел, чтобы это было просто. - person Davio; 01.07.2014

double dec = 20.01;

string amount = string.Format("{0:#.##}", dec);
switch (CultureInfo.CurrentCulture.NumberFormat.CurrencyPositivePattern)
   {
         case 0:
            amount = CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol + amount;
                    break;
         case 1:
            amount = amount + CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol;
                    break;
         case 2:
            amount =  CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol + " " + amount;
                    break;
         case 3:
            amount = amount + " " + CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol;
                    break;
}

Обновлено после комментария Давио

С уважением.

person Aymeric    schedule 01.07.2014
comment
Пожалуйста, прочитайте мой вопрос полностью. Я хочу напечатать десятичное число в строку с символом валюты, но без конечных нулей - person now he who must not be named.; 01.07.2014
comment
глупый вопрос, но вы всегда будете использовать одну и ту же валюту? - person Aymeric; 01.07.2014
comment
@Aymeric точка на самом деле является локализованным десятичным разделителем; если ваша локаль использует для десятичного разделителя . напечатает это. - person Michael Edenfield; 01.07.2014
comment
Как насчет отрицательных значений? Для этого также существует модель валюты! Основная проблема: посмотрите, каким уродливым становится этот код, когда вы хотите эмулировать все, что делает простой {0:C}, только потому, что вы не хотите отрезать несколько нулей. - person Davio; 02.07.2014
comment
Конечно, это усложняет сравнение с {0:C}. Что касается NegativePattern, вы можете справиться с ним так же. - person Aymeric; 02.07.2014

попробуйте этот https://dotnetfiddle.net/F3cJmu

using System;
using System.Globalization;

public class Program
{
public static void Main()
{
    double amount = 39.5555;

    string decimalPoint = (amount).ToString();

    decimalPoint = decimalPoint.Substring(decimalPoint.IndexOf(".") + 1);

    if( decimalPoint.Length > 0)
        Console.WriteLine(string.Format(new CultureInfo("en-US"),"{0:C" + decimalPoint.Length +"}", amount));
    else
        Console.WriteLine(string.Format(new CultureInfo("en-US"),"{0:C}", amount));

}
}
person Rachit Patel    schedule 01.07.2014
comment
Но если количество равно 39.00, то получается 30.0 €. Это должно быть просто 30 € - person now he who must not be named.; 01.07.2014
comment
Эй, проверьте мое обновленное решение. это решение решило проблему размещения символа валюты - person Rachit Patel; 01.07.2014
comment
Кажется, все в порядке. Спасибо :) - person now he who must not be named.; 03.07.2014