.NET String.Format () para agregar comas en miles de lugares para un número

852

Quiero agregar una coma en el lugar de miles para un número.

String.Format()?

Seibar
fuente

Respuestas:

1216
String.Format("{0:n}", 1234);  // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876
Seibar
fuente
39
String.Format("{0:#,##0}", 1234);También funciona sin decimales.
Greg Bray
99
¿Cómo puedo replicar el especificador "N" pero con tantos dígitos decimales como están presentes en el número?
Stephen Drew el
56
@Justin: Según msdn.microsoft.com/en-us/library/0c899ak8.aspx , el ',' (y el '.') Se reemplazan con los caracteres localizados correctos.
Roger Lipscombe
@RogerLipscombe No me había dado cuenta de eso
Justin
66
@VVVV: entonces probablemente esté pasando una cadena en lugar de un número . Si tiene una cadena, primero debe convertir a flotante o doble. Pruebastring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve
379

Encontré que esta es la forma más simple:

myInteger.ToString("N0")
de alquimia
fuente
1
También puede usarlo con string.Format, como en string.Format ("Aquí hay un número con comas y sin decimales, {0: N0}", 123456789 (;
Dan Morphis
16
no debería ser myInteger.ToString ("N0") ... string.tostring no creo que funcione.
Taylor Brown
1
Sé que han pasado 5 años, ¡pero gracias! Funciona para números> 4 caracteres y <4 caracteres.
AskYous
@AskYous - Bueno, también funciona para 4 caracteres. También podría decir que funciona para cualquier longitud.
Broots Waymb
Esto está funcionando pero está cambiando en la configuración regional
saulyasar
149
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000
p.campbell
fuente
27
Esta solución no es buena desde el punto de vista de la internacionalización: otras culturas usan caracteres que no son ,como un separador de miles, por ejemplo, un espacio o incluso ..
Justin
66
Funciona gracias + 1. Se ha extendido para que se muestre un número de hasta 2 dp. ToString ("#, ## 0. ##")
Crab Bucket
8
@MacSigler En realidad no es cierto, vea el comentario de Roger Lipscombe en la respuesta anterior: String.Format aplicará la localización automáticamente.
Dan Bechard
10
@ MacSigler Sin embargo, ese es el problema, este código no siempre imprime una coma. Solo cuando la cultura es una que espera comas (p. Ej., En EE. UU. O invariante). Si la cultura es una que espera otro separador (p .. Ej. ), .NET reemplazará automáticamente la coma con ese separador. Una vez más, le insto a que lea el enlace publicado por Roger si aún no entiende por qué es esto.
Dan Bechard
44
El comentario de @MacSigler Justin sigue siendo correcto en el sentido de que si no obliga explícitamente a la cultura a ingresar a EE. UU., Heredará la configuración de cultura de la máquina local. Tengo entendido que compilar el código anterior y luego ejecutarlo en dos máquinas con diferentes culturas (con diferentes separadores de números) produciría resultados diferentes. Si desea que siempre produzca una coma, debe establecer explícitamente una cultura que utilice la coma (por ejemplo, invariante).
Dan Bechard
98

Si desea una cultura específica, puede probar esto:

(19950000.0).ToString("N",new CultureInfo("en-US")) = 19,950,000.00

(19950000.0).ToString("N",new CultureInfo("is-IS")) = 19.950.000,00

Nota: Algunas culturas suelen ,significar decimales en lugar de .tener cuidado.

prabir
fuente
77

Formatos estándar, con sus salidas relacionadas,

Console.WriteLine("Standard Numeric Format Specifiers");
String s = String.Format("(C) Currency: . . . . . . . . {0:C}\n" +
                    "(D) Decimal:. . . . . . . . . {0:D}\n" +
                    "(E) Scientific: . . . . . . . {1:E}\n" +
                    "(F) Fixed point:. . . . . . . {1:F}\n" +
                    "(G) General:. . . . . . . . . {0:G}\n" +
                    "    (default):. . . . . . . . {0} (default = 'G')\n" +
                    "(N) Number: . . . . . . . . . {0:N}\n" +
                    "(P) Percent:. . . . . . . . . {1:P}\n" +
                    "(R) Round-trip: . . . . . . . {1:R}\n" +
                    "(X) Hexadecimal:. . . . . . . {0:X}\n",
                    - 1234, -1234.565F);
Console.WriteLine(s);

Ejemplo de salida (cultura en-us):

(C) Currency: . . . . . . . . ($1,234.00)
(D) Decimal:. . . . . . . . . -1234
(E) Scientific: . . . . . . . -1.234565E+003
(F) Fixed point:. . . . . . . -1234.57
(G) General:. . . . . . . . . -1234
    (default):. . . . . . . . -1234 (default = 'G')
(N) Number: . . . . . . . . . -1,234.00
(P) Percent:. . . . . . . . . -123,456.50 %
(R) Round-trip: . . . . . . . -1234.565
(X) Hexadecimal:. . . . . . . FFFFFB2E
CoderTao
fuente
2
Esta respuesta contenía mucha información útil. Aprendiendo con el ejemplo, ahora veo lo que significan 0 y 1 en el formato de cadena.
user420667
41

Este es el mejor formato. Funciona en todos esos casos:

String.Format( "{0:#,##0.##}", 0 ); // 0
String.Format( "{0:#,##0.##}", 0.5 ); // 0.5 - some of the formats above fail here. 
String.Format( "{0:#,##0.##}", 12314 ); // 12,314
String.Format( "{0:#,##0.##}", 12314.23123 ); // 12,314.23
String.Format( "{0:#,##0.##}", 12314.2 ); // 12,314.2
String.Format( "{0:#,##0.##}", 1231412314.2 ); // 1,231,412,314.2
Dennis
fuente
1
¿Qué sucede si quiero puntos como mil separadores y comas como delimitador decimal?
FrenkyB
votó porque no muestra 12,314.0 (como el formato n1) pero 12,314 :)
NDUF
34
String.Format("{0:#,###,###.##}", MyNumber)

Eso te dará comas en los puntos relevantes.

Stephen Wrighton
fuente
10
El método ": n" es mejor ya que debe respetar la configuración regional del usuario.
Torlack
12
Esto es cierto, pero no se garantiza que le dé comas en el punto mil porque respeta la configuración regional del usuario.
Stephen Wrighton
2
De vuelta a usted: eso es cierto, pero no se garantiza que respete la configuración regional del usuario porque utiliza comas como separador de miles. (Como ejemplo, en Portugal la coma es en cambio el separador decimal.)
ANeves
1
Si desea imponer valores después de. necesita reemplazar el # con un 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : Zero reemplaza el cero con el dígito correspondiente si está presente; de lo contrario, aparece cero en la cadena de resultados, mientras que el símbolo "#" se reemplaza con el dígito correspondiente si hay uno presente; de lo contrario, no aparece ningún dígito en la cadena de resultados.
Clarice Bouwer
este método funcionó bien para mi requisito, la página msdn sobre el método Int32.ToString que sería un lugar primario donde se usaría msdn.microsoft.com/en-us/library/8wch342y.aspx no es muy útil para este particular aplicación cualquiera
stackuser83
33

La respuesta más votada fue excelente y ha sido útil durante aproximadamente 7 años. Con la introducción de C # 6.0 y específicamente la Interpolación de cadenas, hay una forma más ordenada y, en mi opinión, más segura de hacer lo que se ha pedido to add commas in thousands place for a number:

var i = 5222000;
var s = $"{i:n} is the number"; // results to > 5,222,000.00 is the number
s = $"{i:n0} has no decimal"; // results to > 5,222,000 has no decimal

Donde la variable i se coloca en lugar del marcador de posición (es decir {0}). Por lo tanto, no es necesario recordar qué objeto va a qué posición. El formato (es decir :n) no ha cambiado. Para obtener una característica completa de las novedades, puede ir a esta página .

von v.
fuente
29

tan simple como esto:

float num = 23658; // for example 
num = num.ToString("N0"); // Returns 23,658

Más información está aquí

a_m_dev
fuente
21

Si desea forzar un separador "," independientemente de la cultura (por ejemplo, en un mensaje de seguimiento o registro), el siguiente código funcionará y tiene el beneficio adicional de decirle al siguiente tipo que se topa exactamente lo que está haciendo.

int integerValue = 19400320; 
string formatted = string.Format(CultureInfo.InvariantCulture, "{0:N0}", integerValue);

conjuntos formateados a "19,400,320"

Ravi Desai
fuente
21

El siguiente ejemplo muestra varios valores formateados mediante cadenas de formato personalizadas que incluyen cero marcadores de posición.

String.Format("{0:N1}", 29255.0);

O

29255.0.ToString("N1")

resultado "29,255.0"

String.Format("{0:N2}", 29255.0);

O

29255.0.ToString("N2")

resultado "29,255.00"

Itzjak Weinberg
fuente
buena respuesta, pero ¿qué pasa con 29.255,00?
Roxy'Pro
@ Roxy'Pro ¿Cambiar la configuración regional / cultura?
Maarten Bodewes
@MaartenBodewes Pensé que había una letra correspondiente como "N1", "F1" o algo así =) Pero la cultura chaning funcionaría definitivamente ...
Roxy'Pro
11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));
p.campbell
fuente
3
O Console.WriteLine ("{0: #, #}", num); si solo quieres imprimirlo. Pero string.Format (...) es más útil, supongo.
Indy9000
11

Más simple, usando la interpolación de cadenas en lugar de String.Format

 $"{12456:n0}"; // 12,456
 $"{12456:n2}"; // 12,456.00

o usando su variable

 double yourVariable = 12456.0;
 $"{yourVariable:n0}"; 
 $"{yourVariable:n2}"; 
brakeroo
fuente
9

Por ejemplo, String.Format("{0:0,0}", 1);devuelve 01, para mí no es válido

Esto funciona para mi

19950000.ToString("#,#", CultureInfo.InvariantCulture));

salida 19,950,000

cmujica
fuente
8

Tenga en cuenta que el valor que está formateando debe ser numérico. No parece que tome una representación de cadena de un número y el formato es con comas.


fuente
5
String.Format("0,###.###"); also works with decimal places
Abolfazl Rastgou
fuente
5

C # 7.1 (¿quizás antes?) Hace que esto sea tan fácil y atractivo como debería ser, con interpolación de cadenas:

var jackpot = 1000000;
var niceNumberString = $"Jackpot is {jackpot:n}";
var niceMoneyString = $"Jackpot is {jackpot:C}";
Mark Zhukovsky
fuente
3

Puede utilizar una función como esta para formatear números y, opcionalmente, pasar los decimales deseados. Si no se especifican lugares decimales, usará dos lugares decimales.

    public static string formatNumber(decimal valueIn=0, int decimalPlaces=2)
    {
        return string.Format("{0:n" + decimalPlaces.ToString() + "}", valueIn);
    }

Yo uso decimal pero puedes cambiar el tipo a cualquier otro o usar un objeto anónimo. También puede agregar la verificación de errores para valores decimales negativos.

Dunwan
fuente
-2

El método que solía no preocuparme más por las culturas y los posibles problemas de formato es que lo formateé como moneda y luego saqué el símbolo de moneda.

if (decimal.TryParse(tblCell, out result))

{
  formattedValue = result.ToString("C").Substring(1);
}
8 John Volante
fuente
66
Este código no es independiente de la cultura: utilizará la cultura predeterminada establecida en la máquina que ejecuta el código. Esto podría crear resultados no deseados donde esa cultura coloca sus símbolos de moneda al final del número en lugar del inicio (por ejemplo fr-FR), o usa más de un carácter para denotar la moneda (por ejemplo da-DK), o no separa miles usando comas (por ejemplo, la mayoría de Europa continental).
devuelto el
-2

¡A continuación se muestra una buena solución en Java!

NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println(fmt.format(n));

o para obtener una forma más sólida, es posible que desee obtener la ubicación de un lugar en particular, luego use lo siguiente:

int n=9999999;
Locale locale = new Locale("en", "US");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
System.out.println(fmt.format(n));

SALIDA de US Locale: $ 9,999,999.00

Salida de configuración regional alemana

Locale locale = new Locale("de", "DE");

SALIDA: 9.999.999,00 €

Salida de la configuración regional india

Locale locale = new Locale("de", "DE");

SALIDA: Rs.9,999,999.00

Salida de la configuración regional de Estonia

Locale locale = new Locale("et", "EE");

SALIDA: 9999999 €

Como puede ver en diferentes salidas, no tiene que preocuparse de que el separador sea una coma o un punto o incluso un espacio , puede obtener el número formateado de acuerdo con los estándares i18n

Anirudh
fuente
1
donde usaste la variable locale ??
Smith
bien manchado correctamente, ¿se puede utilizar al obtener la instancia de moneda como: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); corregido el código, gracias!
Anirudh
3
¿Has revisado las etiquetas? ¡La pregunta es sobre C # no Java!
Salar
-3

Si desea mostrarlo en DataGridview, debe cambiar su tipo, ya que el valor predeterminado es String y, dado que lo cambia a decimal, lo considera como Número con punto flotante

Dim dt As DataTable = New DataTable
dt.Columns.Add("col1", GetType(Decimal))
dt.Rows.Add(1)
dt.Rows.Add(10)
dt.Rows.Add(2)

DataGridView1.DataSource = dt
Ali
fuente