2010-01-27 4 views
10

Ich weiß, es trivialerweise in einer Nicht-SQL-Umgebung getan werden könnte [post-Datenverarbeitung, Frontend, was Sie hat], aber das ist nicht möglich, im Moment. Gibt es eine Möglichkeit, eine decimal(5,2) und wandelt es in ein varchar ohne die hinteren Nullen/Dezimalstellen zu nehmen? Zum Beispiel:Gibt es eine einfache Möglichkeit, Dezimalstellen in T-SQL zu formatieren?

declare @number decimal(5,2) 
set @number = 123.00 
select cast(@number as varchar) as FormattedNumber 

Und das Ergebnis ist '123,00'. Gibt es einen (einfachen) Weg, stattdessen '123' zu bekommen? Und statt 123,30 auch 123,3? Könnte es tun, indem Sie herausfinden, ob die Hundertstel/Zehntel-Stellen 0 waren und die Zeichen manuell zugeschnitten haben, aber ich wollte wissen, ob es eine elegantere Lösung gab.

+3

Ich würde die Daten unverändert aus der Datenbank zurückgeben und die Formatierung auf dem Front-End belassen. Gibt es einen Grund, warum Sie das nicht tun können? – AdaTheDev

+1

Ja, wie ich schon sagte, es ist nicht wirklich eine Option - das Frontend ist, wie es aussieht, zu verallgemeinert, um spezielle Fälle der Formatierung bestimmter Felder zu haben (da sich die Anzahl der Spalten ändern kann) und keine andere Spalte formatiert sein, so ist das Einfachste, was ich sehe, einfach aus SQL zu machen. –

+1

Mit SQL Server 2012+ Sie können die Funktion FORMAT() verwenden. Sie würden '#, ##' oder '#, ##. 0' als zweiten Parameter verwenden. msdn.microsoft.com/en-us/library/hh213505.aspx – Volvox

Antwort

13

Was:

SELECT CAST(CAST(@number AS float) AS varchar(10)) 

immer Sie dies wünschen können zuerst mit Ihren Rohdaten sorgfältig zu prüfen.

+0

Vielen Dank! Ich hatte gehofft, dass etwas so einfach ist. –

0

kann die Funktion convert tun, was Sie tun wollen.

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm 
+1

versucht, dass ... ideal für Datum, nichts für Dezimalzahlen –

0

Lassen Sie mich dies erneut versuchen ....

CREATE FUNCTION saneDecimal(@input decimal(5,2)) returns varchar(10) 
AS 
BEGIN 
DECLARE @output varchar(10) 
SET @output = CAST(@input AS varchar(10)) 

DECLARE @trimmable table (trimval char(1)) 
INSERT @trimmable VALUES ('0') 
INSERT @trimmable VALUES ('.') 

WHILE EXISTS (SELECT * FROM @trimmable WHERE trimval = CAST(SUBSTRING(@output, LEN(@output), 1) AS char(1))) 
    SET @output = LEFT(@output, LEN(@output) - 1) 

RETURN @output 
END 

GO 

SELECT dbo.saneDecimal(1.00) 
0

Sie könnten die nachfolgenden Nullen in einer while-Schleife Streifen:

declare @number decimal(5,2) 
declare @str varchar(100) 
set @number = 123.00 
set @str = @number 
while substring(@str,len(@str),1) in ('0','.',',') 
    set @str = substring(@str,1,len(@str)-1) 

Aber wie AdaTheDev kommentierte, ist dies leichter Client-seitig gemacht.

0

Schlicht und elegant? Nicht so viel ... aber das ist T-SQL für Sie:

DECLARE @number decimal(5,2) = 123.00 
DECLARE @formatted varchar(5) = CAST(@number as varchar) 

SELECT 
    LEFT(
     @formatted, 
     LEN(@formatted) 
      - PATINDEX('%[^0.]%', REVERSE(@formatted)) 
      + 1 
    ) 
4

Auf diese Weise ist ziemlich einfach:

DECLARE @Number DECIMAL(5,2) 

SELECT @Number = 123.65 

SELECT FormattedNumber = CAST(CAST(@Number AS DECIMAL(3,0)) AS VARCHAR(4)) 

Returns '124'.

Das einzige, was zu prüfen ist, ob Sie/unten abzurunden wollen, oder Streifen nur die Nullen und Dezimalstellen ohne Rundung; Sie würden den DECIMAL im zweiten Fall als INT darstellen.

-2

Werfen Sie auch einen Blick auf die Funktion von T-SQL STR in der Onlinedokumentation; Dies kann zum Formatieren von Floats verwendet werden und könnte für Ihren Fall funktionieren. Aus irgendeinem Grund kommt es bei Google-Suchanfragen zu diesem Problem nicht vor.

+0

Ja, es gibt einen Grund. Bitte überprüfen Sie die akzeptierte Antwort für diese Frage. – fancyPants

0

Verwenden Sie das Format (Wert, Format-String, Kultur) Funktion in SQL Server 2012+

3

Für kontrollierte Formatierung von Zahlen in T-SQL sollten Sie die FORMAT()-Funktion verwenden. Zum Beispiel:

DECLARE @number DECIMAL(9,2); SET @number = 1234567.12; 
DECLARE @formatted VARCHAR(MAX); SET @formatted = FORMAT(@number, 'N0', 'en-AU'); 
PRINT @formatted; 

Das Ergebnis wird sein:

1,234,567 

Die Argumente der FORMAT() Funktion sind:

FORMAT(value, format [, culture]) 

Der Wert Argument ist Ihre Nummer. Das Format-Argument ist eine CLR-Formatierungszeichenfolge (in diesem Beispiel habe ich "normale Zahl, null Genauigkeit" angegeben).Mit dem optionalen culture-Argument können Sie die Serverkultureinstellung überschreiben, um die Anzahl gemäß einer gewünschten Kultur zu formatieren.

Siehe auch the MSDN ref page for FORMAT().

0

Wenn Sie SQL Server 2012 oder länger haben, können Sie das Format Funktion wie folgt verwendet werden:

select format(@number,'0') as FormattedNumber 

Natürlich ist die Format-Funktion wird eine nvarchar zurück und kein varchar. Sie können einen bestimmten Typ festlegen.

Verwandte Themen