将 VarChar 转换为具有不同文化格式的 Float
Convert VarChar to Float with different culture format
我从不同的外部来源获取数据,其中一些数字位于 NVarChar 字段中。到目前为止,我使用带有 CAST 的 REPLACE 来确保带有“,”的数字以正确的方式进行转换。像这样:
select cast(replace('12,5',',','.') as float)
select cast(replace('12.5',',','.') as float)
这工作得很好,但现在我得到的数据中也有千位分隔符。像这样:
select cast(replace('2.012,5',',','.') as float)
select cast(replace('2,012.5',',','.') as float)
它坏了。
有没有办法检测带数字的 NVarChar 中使用的是哪种数据格式?
我曾尝试将 TRY_PARSE 与区域性参数一起使用,如果有千位分隔符但并非没有:
SELECT @Fuelunits =
CASE
WHEN ISNUMERIC(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL')) = 1
THEN CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL') AS FLOAT)
ELSE CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'en-US') AS FLOAT)
END
问题是我必须在 UPDATE 中使用它,并且数据格式在相同 table 中可能不同。
有什么建议吗?
您可以使用 CHARINDEX()
计算出存在哪些分隔符以及它们在字符串中的位置以及 CASE
表达式来处理 REPLACE
和 [= 之前的不同情况14=] 到 FLOAT
:
CREATE TABLE #vals (val NVARCHAR(10));
INSERT INTO #vals
(
val
)
VALUES
(N'2.012,5'),
(N'2,012.5');
SELECT CAST(CASE
-- is there a '.' in a position before a ','?
WHEN CHARINDEX('.', val) < CHARINDEX(',', val) THEN
-- yes - remove the '.' and replace the ',' with '.'
REPLACE(REPLACE(val, '.', ''), ',', '.')
ELSE
-- no - just remove the ','
REPLACE(v.val, ',', '')
END AS FLOAT)
FROM #vals AS v;
DROP TABLE #vals;
参考文献:
Searches an expression for another expression and returns its starting position if found.
我从不同的外部来源获取数据,其中一些数字位于 NVarChar 字段中。到目前为止,我使用带有 CAST 的 REPLACE 来确保带有“,”的数字以正确的方式进行转换。像这样:
select cast(replace('12,5',',','.') as float)
select cast(replace('12.5',',','.') as float)
这工作得很好,但现在我得到的数据中也有千位分隔符。像这样:
select cast(replace('2.012,5',',','.') as float)
select cast(replace('2,012.5',',','.') as float)
它坏了。 有没有办法检测带数字的 NVarChar 中使用的是哪种数据格式?
我曾尝试将 TRY_PARSE 与区域性参数一起使用,如果有千位分隔符但并非没有:
SELECT @Fuelunits =
CASE
WHEN ISNUMERIC(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL')) = 1
THEN CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL') AS FLOAT)
ELSE CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'en-US') AS FLOAT)
END
问题是我必须在 UPDATE 中使用它,并且数据格式在相同 table 中可能不同。
有什么建议吗?
您可以使用 CHARINDEX()
计算出存在哪些分隔符以及它们在字符串中的位置以及 CASE
表达式来处理 REPLACE
和 [= 之前的不同情况14=] 到 FLOAT
:
CREATE TABLE #vals (val NVARCHAR(10));
INSERT INTO #vals
(
val
)
VALUES
(N'2.012,5'),
(N'2,012.5');
SELECT CAST(CASE
-- is there a '.' in a position before a ','?
WHEN CHARINDEX('.', val) < CHARINDEX(',', val) THEN
-- yes - remove the '.' and replace the ',' with '.'
REPLACE(REPLACE(val, '.', ''), ',', '.')
ELSE
-- no - just remove the ','
REPLACE(v.val, ',', '')
END AS FLOAT)
FROM #vals AS v;
DROP TABLE #vals;
参考文献:
Searches an expression for another expression and returns its starting position if found.