Cómo formatear cadena a dinero


82

Tengo una cadena como 000000000100, que me gustaría convertir a 1,00 y viceversa.

El cero inicial se eliminará, los dos últimos dígitos son el decimal.

Doy más ejemplo:

000000001000 <=> 10.00
000000001005 <=> 10.05
000000331150 <=> 3311.50

Below is the code I am trying, it is giving me result without decimal :

amtf = string.Format("{0:0.00}", amt.TrimStart(new char[] {'0'}));

1
For the other way round multiply by 100 and use PadLeft(12,'0') of the string
V4Vendetta

Respuestas:


76

Convert the string to a decimal then divide it by 100 and apply the currency format string:

string.Format("{0:#.00}", Convert.ToDecimal(myMoneyString) / 100);

Edited to remove currency symbol as requested and convert to decimal instead.


3
and you get the currency symbol for free :) simpler to use 0:#.00
V4Vendetta

@ThePower Thanks, but 'C' will convert to currency, which will return a $ sign.
Alvin

7
You should never use float or double to represent currency.
Jon Grant

2
Why not use double or float? See here: stackoverflow.com/questions/3730019/…
Dov Miller

3
Shouldn't you use "F2" instead of "#.00"?
Paul Groke

57

you will need to convert it to a decimal first, then format it with money format.

EX:

decimal decimalMoneyValue = 1921.39m;
string formattedMoneyValue = String.Format("{0:C}", decimalMoneyValue);

a working example: https://dotnetfiddle.net/soxxuW


43
decimal value = 0.00M;
value = Convert.ToDecimal(12345.12345);
Console.WriteLine(value.ToString("C"));
//OutPut : $12345.12
Console.WriteLine(value.ToString("C1"));
//OutPut : $12345.1
Console.WriteLine(value.ToString("C2"));
//OutPut : $12345.12
Console.WriteLine(value.ToString("C3"));
//OutPut : $12345.123
Console.WriteLine(value.ToString("C4"));
//OutPut : $12345.1234
Console.WriteLine(value.ToString("C5"));
//OutPut : $12345.12345
Console.WriteLine(value.ToString("C6"));
//OutPut : $12345.123450

Console output:


This one will properly respect culture variance. Cultural differences can not only change the symbol, but the digit separators as well (and theoretically the position of the currency symbol). msdn.microsoft.com/en-us/library/syy068tk(v=vs.90).aspx
Robear

22

It works!

decimal moneyvalue = 1921.39m; 
string html = String.Format("Order Total: {0:C}", moneyvalue); 
Console.WriteLine(html);

Output

Order Total: $1,921.39

2
What if I have to remove the dollar sign?
Paris Qian Sen

12

Once you have your string in a double/decimal to get it into the correct formatting for a specific locale use

double amount = 1234.95;

amount.ToString("C") // whatever the executing computer thinks is the right fomat

amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-ie"))    //  €1,234.95
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("es-es"))    //  1.234,95 € 
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-GB"))    //  £1,234.95 

amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-au"))    //  $1,234.95
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-us"))    //  $1,234.95
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-ca"))    //  $1,234.95

GetCultureInfo doesn't appear to exist in UWP.
visc

4
    string s ="000000000100";
    decimal iv = 0;
    decimal.TryParse(s, out iv);
    Console.WriteLine((iv / 100).ToString("0.00"));

You should never use float or double to represent currency.
Jon Grant

4

Try simple like this

 var amtf = $"{Convert.ToDecimal(amt):#0.00}";

3
//Extra currency symbol and currency formatting: "€3,311.50":
String result = (Decimal.Parse("000000331150") / 100).ToString("C");

//No currency symbol and no currency formatting: "3311.50"
String result = (Decimal.Parse("000000331150") / 100).ToString("f2");



0

Try something like this:

decimal moneyvalue = 1921.39m;
string html = String.Format("Order Total: {0:C}", moneyvalue);
Console.WriteLine(html);

0
var tests = new[] {"000000001000", "000000001005", "000000331150"};
foreach (var test in tests)
{
    Console.WriteLine("{0} <=> {1:f2}", test, Convert.ToDecimal(test) / 100);
}

Since you didn't ask for the currency symbol, I've used "f2" instead of "C"


0

try

amtf =  amtf.Insert(amtf.Length - 2, ".");

that doesn't remove the leading zeros. If you're going down the simple string manipulation route you would need to add .Trim("0".ToCharArray()) to the end of your code
Antony Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.