如何将波斯数字转换为 int
how to convert persian number to int
有一个名为 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
。
到目前为止,我使用了 CAST
、CONVERT
和 collate Persian_100_CI_AI
,但我无法得到任何结果。
谢谢。
哪个版本的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);
看看这个话题,它与你问的相反,但如果你能扭转它可能会对你有所帮助:
如果您使用的是最新版本的 sql 服务器,请尝试此 link :
https://docs.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql
显而易见的是SQL没有解决方案out-of-the-box,你必须自己实现某种功能并使用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
有一个名为 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
。
到目前为止,我使用了 CAST
、CONVERT
和 collate Persian_100_CI_AI
,但我无法得到任何结果。
谢谢。
哪个版本的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);
看看这个话题,它与你问的相反,但如果你能扭转它可能会对你有所帮助:
如果您使用的是最新版本的 sql 服务器,请尝试此 link :
https://docs.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql
显而易见的是SQL没有解决方案out-of-the-box,你必须自己实现某种功能并使用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