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

参考文献:

CHARINDEX (Transact-SQL)

Searches an expression for another expression and returns its starting position if found.