.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()?

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

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")

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

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.


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

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

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.


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 .


29

tan simple como esto:

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

Más información está aquí


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"


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"


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));

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}"; 

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


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.



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}";

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.


-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);
}

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


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
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.