¿Cómo convierto un número en una cadena numérica con formato separada por comas?


¿Hay una manera fácil de convertir un número (en mi caso un entero) a una cadena nvarchar separada por comas?

Por ejemplo, si tuviera un valor int de 1000000 almacenado en un campo, ¿cómo puedo convertirlo a una cadena nvarchar con el resultado de salida de "1,000,000"?

Podría escribir fácilmente una función para hacer esto, pero quería estar seguro de que no había una manera más fácil de involucrar una llamada a CAST o CONVERT.

Author: RLH, 2011-06-10

9 answers

Para SQL Server 2012, o posterior, una solución más fácil es usar FORMAT ()Documentación.
EG:

SELECT Format(1234567.8, '##,##0') 

Resultados en: 1,234,568

 17
Author: Jacob Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-30 20:30:49

La razón por la que no encuentra ejemplos fáciles de cómo hacer esto en T-SQL es que generalmente se considera una mala práctica implementar la lógica de formato en el código SQL. Los RDBM simplemente no están diseñados para presentación. Si bien es posible hacer algún formato limitado, casi siempre es mejor dejar que la aplicación o la interfaz de usuario manejen el formato de este tipo.

Pero si debe (y a veces debemos!) use T-SQL, cast your int to money y conviértalo a varchar, así:

select convert(varchar,cast(1234567 as money),1)

Si no quieres los decimales finales, haz esto:

select replace(convert(varchar,cast(1234567 as money),1), '.00','')

¡Buena suerte!

 51
Author: Michael Ames,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-10 16:55:21

Rápido y sucio para int a nnn,nnn...

declare @i int = 123456789
select replace(convert(varchar(128), cast(@i as money), 1), '.00', '')
>> 123,456,789
 3
Author: Alex K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-10 16:54:46

No estoy seguro de que funcione en tsql, pero algunas plataformas tienen to_char():

test=#select to_char(131213211653.78, '9,999,999,999,999.99');
        to_char        
-----------------------
    131,213,211,653.78
test=# select to_char(131213211653.78, '9G999G999G999G999D99');
        to_char        
-----------------------
    131,213,211,653.78
test=# select to_char(485, 'RN');
     to_char     
-----------------
         CDLXXXV

Como sugiere el ejemplo, la longitud del formato debe coincidir con la del número para obtener mejores resultados, por lo que es posible que desee envolverlo en una función (por ejemplo, number_format()) si es necesario.


Convertir a dinero también funciona, como señalan los otros replicantes.

test=# select substring(cast(cast(131213211653.78 as money) as varchar) from 2);
     substring      
--------------------
 131,213,211,653.78
 3
Author: Denis de Bernardy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-10 16:58:15

Realmente no debería estar haciendo eso en SQL, sino que debería formatearlo en el middleware. Pero reconozco que a veces hay un caso extremo que requiere que uno haga tal cosa.

Esto parece que podría tener su respuesta:

¿Cómo formateo un número con comas en T-SQL?

 1
Author: djdanlib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:43

Miré varias de las opciones. Aquí están mis dos favoritos, porque necesitaba redondear el valor.

,DataSizeKB = replace(convert(varchar,Cast(Round(SUM(BigNbr / 0.128),0)as money),1), '.00','')
,DataSizeKB2   = format(Round(SUM(BigNbr / 0.128),0),'##,##0')
-----------------
--- below if the full script where I left DataSizeKB in both methods -----------
--- enjoy --------- 
--- Hank Freeman : [email protected] 
-----------------------------------
--- Scritp to get rowcounts and Memory size of index and Primary Keys
   SELECT
   FileGroupName = DS.name
   ,FileGroupType =
      CASE DS.[type]
        WHEN 'FG' THEN 'Filegroup'
        WHEN 'FD' THEN 'Filestream'
        WHEN 'FX' THEN 'Memory-optimized'
        WHEN 'PS' THEN 'Partition Scheme'
        ELSE 'Unknown'
      END
   ,SchemaName = SCH.name
   ,TableName = OBJ.name
   ,IndexType =
      CASE IDX.[type]
        WHEN 0 THEN 'Heap'
        WHEN 1 THEN 'Clustered'
        WHEN 2 THEN 'Nonclustered'
        WHEN 3 THEN 'XML'
        WHEN 4 THEN 'Spatial'
        WHEN 5 THEN 'Clustered columnstore'
        WHEN 6 THEN 'Nonclustered columnstore'
        WHEN 7 THEN 'Nonclustered hash'
      END
   ,IndexName = IDX.name
   ,RowCounts = replace(convert(varchar,Cast(p.rows as money),1), '.00','')  --- MUST show for all types when no Primary key
   --,( Case WHEN IDX.[type] IN (2,6,7) then 0  else  p.rows  end )as Rowcounts_T
   ,AllocationDesc = AU.type_desc
/*
   ,RowCounts = p.rows  --- MUST show for all types when no Primary key
   ,TotalSizeKB2  = Cast(Round(SUM(AU.total_pages / 0.128),0)as int) -- 128 pages per megabyte
   ,UsedSizeKB    = Cast(Round(SUM(AU.used_pages / 0.128),0)as int) 
   ,DataSizeKB    = Cast(Round(SUM(AU.data_pages / 0.128),0)as int)
    --replace(convert(varchar,cast(1234567 as money),1), '.00','')
*/
   ,TotalSizeKB   = replace(convert(varchar,Cast(Round(SUM(AU.total_pages / 0.128),0)as money),1), '.00','') -- 128 pages per megabyte
   ,UsedSizeKB    = replace(convert(varchar,Cast(Round(SUM(AU.used_pages / 0.128),0)as money),1), '.00','') 
   ,DataSizeKB    = replace(convert(varchar,Cast(Round(SUM(AU.data_pages / 0.128),0)as money),1), '.00','')
   ,DataSizeKB2   = format(Round(SUM(AU.data_pages / 0.128),0),'##,##0')
   ,DataSizeKB3   = format(SUM(AU.data_pages / 0.128),'##,##0')
   --SELECT Format(1234567.8, '##,##0.00')
   ---
   ,is_default    = CONVERT(INT,DS.is_default)
   ,is_read_only = CONVERT(INT,DS.is_read_only)
  FROM
   sys.filegroups DS -- you could also use sys.data_spaces
    LEFT JOIN sys.allocation_units AU ON DS.data_space_id = AU.data_space_id
    LEFT JOIN sys.partitions PA
      ON (AU.[type] IN (1,3) AND
          AU.container_id = PA.hobt_id) OR
         (AU.[type] = 2 AND
          AU.container_id = PA.[partition_id])
    LEFT JOIN sys.objects OBJ ON PA.[object_id] = OBJ.[object_id]
    LEFT JOIN sys.schemas SCH ON OBJ.[schema_id] = SCH.[schema_id]
    LEFT JOIN sys.indexes IDX
      ON PA.[object_id] = IDX.[object_id] AND
         PA.index_id = IDX.index_id
    -----
    INNER JOIN 
      sys.partitions p ON obj.object_id = p.OBJECT_ID AND IDX.index_id = p.index_id
  WHERE
    OBJ.type_desc = 'USER_TABLE' -- only include user tables
    OR
    DS.[type] = 'FD' -- or the filestream filegroup
  GROUP BY
    DS.name ,SCH.name ,OBJ.name ,IDX.[type] ,IDX.name ,DS.[type]  ,DS.is_default   ,DS.is_read_only -- discard different allocation units
   ,p.rows  ,AU.type_desc  --- 
  ORDER BY
    DS.name ,SCH.name ,OBJ.name ,IDX.name
   ---
   ;
 0
Author: Hank Freeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-04 17:47:18

Desde SQL Server 2012 (& arriba), el método FORMAT() proporciona la solución más rápida y sencilla. Aquí hay algunos consejos.

Sintaxis: Format( value, format [, culture ] )

Regresos: La función Format devuelve la cadena NVarchar formateada con el formato especificado y con la cultura opcional. (Devuelve NULL para una cadena de formato no válida.)

Nota: La función Format() es consistente en todos los lenguajes CLR/. NET y proporciona la máxima flexibilidad para generar formato salida.

Los siguientes son algunos tipos de formato que se pueden lograr usando esta función:

  • Formato numérico / Moneda - 'C' para moneda, 'N' número sin símbolo de moneda, 'x' para Hexa-decimales.

  • Formato de fecha/hora - 'd' fecha corta, 'D' fecha larga, 'f' fecha/hora completa corta, 'F' fecha/hora completa larga, 't' tiempo corto, 'T' tiempo largo, 'm' mes+día, 'y' año+mes.

  • Formato personalizado - puede forme su propio formato personalizado utilizando ciertos símbolos/caracteres, como dd, mm, aaaa, etc. (para Fechas). hash ( # ) símbolos de moneda (£etc etc.), coma (,) y así sucesivamente. Vea los ejemplos a continuación.

Ejemplos:

Ejemplos de Numérico/Moneda incorporado Formatos:

   select FORMAT(1500350.75, 'c', 'en-gb') --> £1,500,350.75
   select FORMAT(1500350.75, 'c', 'en-au') --> $1,500,350.75
   select FORMAT(1500350.75, 'c', 'en-in') -->  15,00,350.75

Ejemplos de Fecha incorporada Formatos:

   select FORMAT(getdate(), 'd', 'en-gb') --> 20/06/2017
   select FORMAT(getdate(), 'D', 'fr-fr') --> mardi 20 juin 2017
   select FORMAT(getdate(), 'F', 'en-us') --> Tuesday, June 20, 2017 10:41:39 PM
   select FORMAT(getdate(), 'T', 'en-gb') --> 22:42:29

Ejemplos de Formato Personalizado:

   select FORMAT(GETDATE(), 'dd/MM/yyyy') --> 20/06/2017
   select FORMAT(GETDATE(), 'dd-MMM-yyyy') --> 20/Jun/2017
   select FORMAT(GETDATE(), 'dd.MMMM.yyyy HH:mm:ss') --> 20.June.2017 22:47:20
   select FORMAT(123456789.75,'$#,#.00')  --> $123,456,789.75
   select FORMAT(123456789.75,'£#,#.0')   --> £123,456,789.8

Véase MSDN para más información.

 0
Author: Eddie Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-24 08:31:40

En DB2 se puede utilizar: varchar_format (1234, "99999G999") resultado: 1,234

 -2
Author: Raul Guerrero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-20 17:44:40

Eliminar las comas con un reemplazar y convertir:

CONVERT(INT,REPLACE([varName],',',''))

Donde varName es el nombre de la variable que tiene valores numéricos con comas

 -5
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-13 13:09:29