Как мне преобразовать число в числовую строку, разделенную запятыми? - PullRequest
28 голосов
/ 10 июня 2011

Есть ли простой способ преобразовать число (в моем случае целое число) в строку nvarchar, разделенную запятой?

Например, если у меня в поле хранится значение int 1000000, как я могу преобразовать его в строку nvarchar с выводимым результатом "1,000,000"?

Я мог бы легко написать функцию, чтобы сделать это, но я хотел убедиться, что не было более простого способа задействовать вызов либо CAST, либо CONVERT.

Ответы [ 8 ]

52 голосов
/ 10 июня 2011

Причина, по которой вы не находите простых примеров того, как это сделать в T-SQL, заключается в том, что в целом логика форматирования в коде SQL считается плохой практикой. СУБД просто не предназначены для представления. Хотя возможно выполнить ограниченное форматирование, почти всегда лучше, чтобы приложение или пользовательский интерфейс обрабатывали форматирование этого типа.

Но если вы должны (а иногда и мы должны!) Использовать T-SQL, приведите свой int к деньгам и преобразуйте его в varchar, например:

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

Если вы не хотите использовать конечные десятичные дроби, сделайте следующее:

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

Удачи!

21 голосов
/ 24 декабря 2014

Для SQL Server 2012 или новее, более простое решение - использовать FORMAT () Документация .
EG:

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

Результат: 1,234,568

3 голосов
/ 10 июня 2011

Быстрый и грязный от int до nnn, nnn ...

declare @i int = 123456789
select replace(convert(varchar(128), cast(@i as money), 1), '.00', '')
>> 123,456,789
3 голосов
/ 10 июня 2011

Не уверен, что он работает в tsql, но на некоторых платформах имеет 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

Как показывает пример, длина формата должна совпадать с длиной числа для достижения наилучших результатов, поэтому вы можете захотеть обернуть ее в функцию (например, number_format ()), если необходимо.


Преобразование в деньги тоже работает, как указывают другие респонденты.

test=# select substring(cast(cast(131213211653.78 as money) as varchar) from 2);
     substring      
--------------------
 131,213,211,653.78
2 голосов
/ 21 июня 2017

В SQL Server 2012 (и выше) метод FORMAT () обеспечивает самое быстрое и простое решение. Вот несколько советов.

Синтаксис : Format( value, format [, culture ] )

Возвращает : Функция форматирования возвращает строку NVarchar, отформатированную в указанном формате и с необязательной культурой. (Возвращает NULL для неверной строки формата.)

Примечание. Функция Format () одинакова для всех языков CLR / .NET и обеспечивает максимальную гибкость при формировании форматированного вывода.

Ниже приведено несколько типов форматов, которые могут быть получены с помощью этой функции:

  • Числовое / валютное форматирование - «C» для валюты, «N» номер без символа валюты, «x» для шестнадцатеричных десятичных знаков.

  • Форматирование даты / времени - короткая дата «d», длинная дата «D», короткая полная дата / время «f», длинная полная дата / время «F», «t» короткое время, 'T' долгое время, 'm' месяц + день, 'y' год + месяц.

  • Пользовательское форматирование - вы можете сформировать свой собственный формат, используя определенные символы / символы, такие как дд, мм, гггг и т. Д. (Для дат). хэш (#) символы валют (£ $ и т. д.), запятая (,) и т. д. См. Примеры ниже.

Примеры

Примеры Встроенная цифра / валюта Форматы:

   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

Примеры Встроенная дата Форматы:

   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

Примеры Пользовательское форматирование :

   select FORMAT(GETDATE(), 'ddd  dd/MM/yyyy')  --> Tue 20/06/2017
   select FORMAT(GETDATE(), 'dddd dd-MMM-yyyy') --> Tuesday 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

См. MSDN для получения дополнительной информации.

0 голосов
/ 21 апреля 2015

Я посмотрел на несколько вариантов.Вот мои два фаворита, потому что мне нужно было округлить значение.

,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 : hfreeman@msn.com 
-----------------------------------
--- 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 голосов
/ 13 сентября 2012

удалить запятые с заменой и преобразовать:

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

, где varName - имя переменной, в которой числовые значения с запятыми

0 голосов
/ 10 июня 2011

Вы действительно не должны делать это в SQL - вместо этого вы должны отформатировать его в промежуточном программном обеспечении.Но я признаю, что иногда есть крайний случай, который требует, чтобы кто-то сделал это.

Похоже, у вас есть ответ:

Как мне отформатировать числозапятые в T-SQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...