【问题标题】:how to convert persian number to int如何将波斯数字转换为int
【发布时间】:2018-03-27 11:15:16
【问题描述】:

有一个名为 value 的 nvarchar(100) 列,当用户插入此列时,我需要在触发器中检查以下代码:

if exists
(
    select *
    from inserted i
    where isnumeric(value)=0
)
begin
    rollback transaction
    raiserror('when productType is numeric, You have to insert numeric character',18,1)
    return
end

但在应用程序接口编号中插入波斯语,所以总是isnumeric(value)=0

例如,如果用户在界面中插入۴۵,我需要在我的触发器值中显示为45

到目前为止,我使用了CASTCONVERTcollate Persian_100_CI_AI,但没有得到任何结果。

谢谢。

【问题讨论】:

  • 波斯数字只是 SQL Server 的文本。转换数字客户端或查找 SQL Server 扩展(如 UDF 或 CLR UDF)。看到这个question about Persian dates

标签: sql sql-server data-conversion


【解决方案1】:

SQL Server 的哪个版本? v2017+ 提供new function TRANSLATE

可能,有一种更优雅的方式,但实用的方式是这样的:

DECLARE @PersianNumber NVARCHAR(100)=N'۴۵';
SELECT CAST(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
           (@PersianNumber,N'۰',N'0'),N'۱',N'1'),N'۲',N'2'),N'۳',N'3'),N'۴',N'4')
                          ,N'۵',N'5'),N'۶',N'6'),N'۷',N'7'),N'۸',N'8'),N'۹',N'9') AS INT);

【讨论】:

  • 所以只是字符不同?不错的一个
  • @Andomar,老实说:我希望如此 :-)(简短的研究让它看起来像这样......)
  • 谢谢你!它确实可以正常工作,但是我使用了 10 个单独的替换而不是这个解决方案,并且我用客户端统计数据检查了它们,它确实分别有更好的时间结果!非常感谢
【解决方案2】:

看看这个话题,它与你所问的相反,但如果你能扭转它,它可能会对你有所帮助:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a44ce5c1-d487-4043-be73-b64fa98ed7a5/converting-english-numbers-to-arabic-numbers-and-vice-versa

如果你使用的是最新版本的sql server,试试这个链接:

https://docs.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql

显而易见的是,SQL 没有开箱即用的解决方案,您必须自己实现某种功能并在 WHERE 语句中使用返回值。

我已经使用 Shungo 的答案来实现您需要的功能(也适用于英文数字或两者的混合):

CREATE FUNCTION IS_NORMALIZED_NUMBER (@PersianNumber NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
BEGIN
    SET @PersianNumber = CAST(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
           (@PersianNumber,N'۰',N'0'),N'۱',N'1'),N'۲',N'2'),N'۳',N'3'),N'۴',N'4')
                          ,N'۵',N'5'),N'۶',N'6'),N'۷',N'7'),N'۸',N'8'),N'۹',N'9') AS NVARCHAR(MAX));
    RETURN ISNUMERIC(@PersianNumber)
END

这是一个更优化的版本(仅适用于波斯数字):

CREATE FUNCTION IS_NUMBER (@PersianNumber NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
BEGIN
    RETURN IIF(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
           (@PersianNumber,N'۰',N''),N'۱',N''),N'۲',N''),N'۳',N''),N'۴',N'')
                          ,N'۵',N''),N'۶',N''),N'۷',N''),N'۸',N''),N'۹',N'') = N'',1 ,0 );
END

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多