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'}));
Alvin
fuente
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.

Lloyd Powell
fuente
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

Mohammed Swillam
fuente
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:

Bhanu Pratap
fuente
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
Jorge Luis Peña Lopez
fuente
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
Aaron Sherman
fuente
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"));
Habib
fuente
You should never use float or double to represent currency.
Jon Grant
4

Try simple like this

 var amtf = $"{Convert.ToDecimal(amt):#0.00}";
SkyKing
fuente
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");
Piotr Justyna
fuente
2

you can also do :

string.Format("{0:C}", amt)
Jackal
fuente
1

Parse to your string to a decimal first.

greijner
fuente
0

Try something like this:

decimal moneyvalue = 1921.39m;
string html = String.Format("Order Total: {0:C}", moneyvalue);
Console.WriteLine(html);
thejartender
fuente
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"

Antony Scott
fuente
0

try

amtf =  amtf.Insert(amtf.Length - 2, ".");
Pera
fuente
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