Подтвердить что ты не робот

Как преобразовать число в числовую, отформатированную в запятую строку?

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Причина, по которой вы не находите простых примеров того, как это сделать в 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','')

Удачи!

Ответ 3

Не уверен, что он работает в 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

Ответ 4

Быстрая и грязная для int для nnn, nnn...

declare @i int = 123456789
select replace(convert(varchar(128), cast(@i as money), 1), '.00', '')
>> 123,456,789

Ответ 5

Хотя форматирование относится к уровню представления, версии SQL Server 2012 и более поздние версии предоставляют функцию FORMAT(), которая обеспечивает один из самых быстрых и простых способов форматирования вывода. Вот несколько советов & Примеры:

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

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

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

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

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

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

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

Примеры:

Примеры встроенных числовых/валютных форматов:

   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 для получения дополнительной информации о функции FORMAT().

Для SQL Server 2008 или ниже сначала преобразуйте вывод в MONEY, затем в VARCHAR (передавая "1" для 3-го аргумента функции CONVERT(), чтобы указать "стиль" для output- формат), например:

   select CONVERT(VARCHAR, CONVERT(MONEY, 123456789.75), 1)    --> 123,456,789.75

Ответ 6

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

Похоже, у вас может получиться ваш ответ:

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

Ответ 7

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

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

Ответ 8

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

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

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