Här är ett snabbt sätt att lägga till hakparenteser runt negativa tal i SQL Server när du använder FORMAT()
fungera.
Målet här är att hakparenteser bara läggs till negativa värden. Inga parenteser läggs till positiva värden eller nollor. Dessutom ersätter parenteserna alla minustecken som annars skulle visas (med andra ord, inget minustecken visas när parenteserna används).
Även om formatering ofta bäst lämnas till presentationslagret, kan det finnas fall som dikterar en T-SQL-lösning i SQL Server. I sådana fall hjälper förhoppningsvis den här artikeln.
Exempel 1 – Automatiska parenteser
Som nämnts använder lösningarna i den här artikeln FORMAT()
fungera. Den här funktionen formaterar ett numeriskt (eller datum/tid) värde och returnerar sedan en formaterad strängrepresentation av det värdet.
När du anropar den här funktionen skickar du värdet som ska formateras och en formatsträng som bestämmer hur den ska formateras. Du kan också ange ett tredje argument för att definiera lokalen/kulturen som ska användas för utdata.
Det jag vill med detta är att det finns några fall där FORMAT()
kommer automatiskt att omge negativa värden med hakparenteser, beroende på formatsträngen och kulturen som används.
Här är ett exempel på att formatera ett tal som en valuta med två olika "kultur"-argument:
SELECT FORMAT(-1.23, 'C', 'en-us') 'en-us', FORMAT(-1.23, 'C', 'en-gb') 'en-gb';
Resultat:
+---------+---------+ | en-us | en-gb | |---------+---------| | ($1.23) | -£1.23 | +---------+---------+
I det här fallet är det en kombination av formatsträngen och kulturen som avgör om negativa värden är omgivna av parenteser eller inte.
C
är en standard numerisk formatspecifikation, som formaterar numret som en valuta. När denna formatspecifikation används bestäms den exakta utdata av kulturen. Detta beror på att olika kulturer använder olika konventioner för att visa valutabelopp. Kulturen kommer att bestämma vilken valutasymbol som ska användas, dess placering, samt hur negativa värden visas.
Om du inte anger en kultur kommer språket för den aktuella sessionen att användas. Detta är vanligtvis standardspråket för användaren, men det kan också ändras med SET LANGUAGE
uttalande.
Exempel 2 – Villkorlig formatering
Om en standardformatsträng inte ger de resultat du behöver, måste du istället använda en anpassad numerisk formatsträng.
Här är ett exempel på hur man använder en anpassad numerisk formatsträng för att omge resultatet inom parentes:
SELECT FORMAT(-123, '0; (0)') Result;
Resultat:
+----------+ | Result | |----------| | (123) | +----------+
För att uppnå de resultat vi vill ha använder formatsträngen en sektionsavgränsare för att tillhandahålla villkorlig formatering.
Villkorlig formatering är där du anger ett annat format, beroende på ett givet villkor. När du använder FORMAT()
funktion, kan du använda villkorlig formatering för att tillämpa olika formatering på ett tal, beroende på om talet är positivt, negativt eller noll.
I detta sammanhang är villkorlig formatering möjlig av semikolon (;
). Detta kallas för "sektionsavgränsaren". I det här fallet använde jag bara ett semikolon, eftersom jag bara vill ha två avsnitt (för att skilja på negativa och icke-negativa).
När endast två avsnitt ingår gäller det första avsnittet både positiva värden och nollor. Det andra avsnittet gäller negativa värden. Du kan också lägga till ytterligare ett semikolon för att ange ett annat format bara för nollor (mer om det nedan).
Exempel 3 – Jämfört med positiv och noll
Här är ett annat exempel, den här gången inkluderar jag ett positivt värde och noll (bara för att visa poängen tydligare).
SELECT FORMAT(-123, '0; (0)') Negative, FORMAT(123, '0; (0)') Positive, FORMAT(0, '0; (0)') Zero;>
Resultat:
+------------+------------+--------+ | Negative | Positive | Zero | |------------+------------+--------| | (123) | 123 | 0 | +------------+------------+--------+
Exempel 4 – Alternativ formatering
Du är inte begränsad till bara parenteser. Du kan till exempel använda lockiga hängslen, eller hakparenteser, eller nästan vad du vill.
SELECT FORMAT(-123, '0; {0}') R1, FORMAT(-123, '0; [0]') R2, FORMAT(-123, '0; WARNING! NEGATIVE VALUE!!!') R3;
Resultat:
+--------+--------+-----------------------------+ | R1 | R2 | R3 | |--------+--------+-----------------------------| | {123} | [123] | WARNING! NEGATIVE VALUE!!! | +--------+--------+-----------------------------+
Exempel 5 – Tre villkor
Som nämnts kan du också lägga till ett tredje villkor för att tillhandahålla separat formatering för nollor. Här är ett snabbt exempel:
SELECT FORMAT(-123, '0; (0); 0 (Zero)') R1, FORMAT(123, '0; (0); 0 (Zero)') R2, FORMAT(0, '0; (0); 0 (Zero)') R3;
Resultat:
+--------+------+-----------+ | R1 | R2 | R3 | |--------+------+-----------| | (123) | 123 | 0 (Zero) | +--------+------+-----------+
Exempel 6 – Var är minustecknet?
Du kanske har märkt att minustecknet inte ens har synts på de negativa värdena. Detta beror på att sektionsavgränsaren ignorerar all befintlig formatering på ett värde (inklusive eventuella minustecken). Det betyder att om du använder villkorlig formatering och du faktiskt vill ha minustecknet på negativa värden, måste du lägga till det i din formatsträng:
SELECT FORMAT(-123, '0; 0 (Negative); 0 (Zero)') 'Without Minus Sign', FORMAT(-123, '0; -0 (Negative); 0 (Zero)') 'With Minus Sign';
Resultat:
+----------------------+-------------------+ | Without Minus Sign | With Minus Sign | |----------------------+-------------------| | 123 (Negative) | -123 (Negative) | +----------------------+-------------------+
Det finns dock vissa fall där minustecknet förblir intakt (åtminstone på mitt system):
SELECT FORMAT(123, '0;; 0 (Zero)') Positive, FORMAT(-123, '0;; 0 (Zero)') Negative;
Resultat:
+------------+------------+ | Positive | Negative | |------------+------------| | 123 | -123 | +------------+------------+
I det här exemplet delar negativa och positiva värden samma avsnitt. Detta beror på att jag lade till en sektionsavgränsare för negativa värden men lämnade den tom. I det här fallet gäller formatsträngen i det första avsnittet både positiva och negativa värden.
Som nämnts, i detta fall förblir minustecknet intakt för negativa värden.