2011-06-10 91 views
25

Có cách nào dễ dàng để chuyển đổi một số (trong trường hợp của tôi là một số nguyên) thành một dấu phẩy được phân tách bằng nvarchar chuỗi không?Làm cách nào để chuyển đổi một số thành chuỗi được định dạng bằng dấu phẩy, được phân tách bằng dấu phẩy?

Ví dụ: nếu tôi có giá trị int của 1000000 được lưu trữ trong một trường, làm cách nào tôi có thể chuyển đổi nó thành chuỗi nvarchar với kết quả đã xuất là "1.000.000"?

Tôi có thể dễ dàng viết một chức năng để thực hiện việc này nhưng tôi muốn chắc chắn không có cách nào dễ dàng hơn liên quan đến cuộc gọi đến CAST hoặc CONVERT.

+1

Bạn đang cố gắng chuyển từ '1000000' sang '1.000.000'? –

+0

Có thể trùng lặp [Làm cách nào để định dạng một số bằng dấu phẩy trong T-SQL?] (Https://stackoverflow.com/questions/4377352/how-do-i-format-a-number-with-commas-in- t-sql) –

Trả lời

17

Đối với SQL Server 2012 hoặc mới hơn, dễ dàng hơn ution là sử dụng FORMAT()Documentation.
EG:

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

Kết quả trong: 1,234,568

+0

Đây là câu trả lời hay nhất cho các phiên bản hiện tại của MS-SQL. –

+0

Tôi đang gán lại điều này làm câu trả lời mới vì nó phù hợp hơn cho các biến thể của SQL Server hiện nay. – RLH

+0

hoặc đơn giản là 'Định dạng CHỌN (1234567.8, '#, 0')' –

3

Không chắc nó hoạt động trong TSQL, nhưng some platformsto_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 

Một ví dụ cho thấy, chiều dài của định dạng cần để phù hợp với số lượng cho kết quả tốt nhất, vì vậy bạn có thể muốn quấn nó trong một hàm (ví dụ number_format()) nếu cần.


Chuyển đổi thành tiền hoạt động quá, như được chỉ ra bởi các trình phát lại khác.

test=# select substring(cast(cast(131213211653.78 as money) as varchar) from 2); 
    substring  
-------------------- 
131,213,211,653.78 
2

nhanh & bẩn cho int để nnn, nnn ...

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

Lý do bạn không tìm ví dụ đơn giản về cách làm điều này trong T-SQL là nó thường được coi thực hành không tốt để triển khai định dạng logic trong mã SQL. RDBMS chỉ đơn giản là không được thiết kế để trình bày. Mặc dù có thể thực hiện một số định dạng có giới hạn nhưng hầu như lúc nào cũng tốt hơn để cho phép ứng dụng hoặc giao diện người dùng xử lý định dạng loại này.

Nhưng nếu bạn phải (và đôi khi chúng ta phải!) Sử dụng T-SQL, đúc int của bạn để tiền và chuyển nó sang varchar, như thế này:

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

Nếu bạn không muốn số thập phân sau, làm điều này:

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

Chúc may mắn!

+0

Vâng, tuyên bố thứ hai đó là những gì tôi đang tìm kiếm. Trong trường hợp của câu lệnh này, tôi phải tạo một bảng với một cột cụ thể có dữ liệu ở các vị trí cố định. Một số dữ liệu đó là số và người dùng chính (ahem, sếp của tôi) muốn dữ liệu được định dạng. Có, tôi có thể lặp qua bảng trong ứng dụng C# của tôi, tuy nhiên, tôi thích giữ thao tác dữ liệu bảng ở mức tối thiểu khi dữ liệu đến từ SQL chỉ để hiển thị. Có lẽ đó được coi là "thực hành không tốt" nhưng tôi muốn giữ cơ sở "dữ liệu" của tôi như là nguồn chính của "dữ liệu". – RLH

+0

Thân hình đẹp. Chúc mừng – Rikki

+0

@RLH Định dạng là một mối quan tâm trình bày. Việc bổ sung các dấu 0 và dấu phẩy không phải là một phần của dữ liệu, nhưng chắc chắn làm cho nó thân thiện với con người hơn khi hiển thị nó trong lớp trình bày. – jinglesthula

1

Bạn thực sự không nên làm điều đó trong SQL - bạn nên định dạng nó trong phần mềm trung gian thay thế. Nhưng tôi nhận ra rằng đôi khi có một trường hợp cạnh mà đòi hỏi một để làm một điều như vậy.

này trông giống như nó có thể có câu trả lời của bạn:

How do I format a number with commas in T-SQL?

+1

Điều này phải là một bình luận hoặc không bao gồm ở tất cả các ủng hộ đánh dấu nó một bản sao – jmorc

-5

loại bỏ các dấu phẩy với một thay thế và chuyển đổi:

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

nơi VARNAME là tên của biến có giá trị số trong đó với dấu phẩy

+3

Điều này trái ngược với câu trả lời tôi như ban đầu đang tìm kiếm. Tôi có một số và tôi muốn chuyển nó thành một chuỗi, được định dạng bằng dấu phẩy. – RLH

0

Tôi nhìn tại một số các tùy chọn. Dưới đây là hai yêu thích của tôi, bởi vì tôi cần phải làm tròn giá trị.

,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

Từ SQL Server 2012 (& ở trên), phương thức FORMAT() cung cấp giải pháp nhanh nhất và dễ nhất. Dưới đây là một số mẹo.

Cú pháp: Format(value, format [, culture ])

Returns: Định dạng hàm trả nvarchar chuỗi định dạng với định dạng cụ thể và với văn hóa tùy chọn. (Trả về NULL cho chuỗi định dạng không hợp lệ.)

Lưu ý: Hàm Format() nhất quán trên CLR/tất cả ngôn ngữ .NET và cung cấp tính linh hoạt tối đa để tạo đầu ra được định dạng.

Sau đây là vài loại định dạng mà có thể đạt được sử dụng chức năng này:

  • Numeric/ngoại tệ định dạng - 'C' cho tiền tệ, số 'N' mà không cần ký hiệu tiền tệ, 'x' cho Hexa -decimals.

  • Định dạng ngày/giờ - 'd' ngày ngắn, 'D' ngày dài, 'f' toàn ngày/giờ ngắn, 'F' ngày/giờ đầy đủ, 't' thời gian ngắn, 'T 'thời gian dài', m 'tháng + ngày,' y 'năm + tháng.

  • Định dạng tùy chỉnh - bạn có thể tạo định dạng tùy chỉnh của riêng mình bằng ký hiệu/ký tự nhất định, ví dụ: dd, mm, yyyy. băm (#) ký hiệu tiền tệ (£ $ vv), dấu phẩy (,) và vv. Xem ví dụ bên dưới.

Ví dụ:

Ví dụ về Built-in Numeric/ngoại tệ Định dạng:

 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 

Ví dụ về định dạng Built-in ngày:

 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 

Ví dụ về Tuỳ chỉnh Formatting:

 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 

Xem MSDN để biết thêm thông tin.

Các vấn đề liên quan