惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
Cloudbric
Cloudbric
P
Palo Alto Networks Blog
T
Threatpost
T
Tor Project blog
T
Tenable Blog
AWS News Blog
AWS News Blog
Project Zero
Project Zero
L
LangChain Blog
Cyberwarzone
Cyberwarzone
Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
C
CERT Recently Published Vulnerability Notes
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Latest
Security Latest
云风的 BLOG
云风的 BLOG
I
Intezer
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
MongoDB | Blog
MongoDB | Blog
aimingoo的专栏
aimingoo的专栏
K
Kaspersky official blog
Jina AI
Jina AI
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
D
DataBreaches.Net
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
Recorded Future
Recorded Future
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Secure Thoughts
TaoSecurity Blog
TaoSecurity Blog
P
Privacy & Cybersecurity Law Blog
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
IT之家
IT之家
Forbes - Security
Forbes - Security
The Hacker News
The Hacker News
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
Y
Y Combinator Blog

博客园 - ☆用心生活☆

BI-日期维度表-SQL SERVER SQL SERVER 2014 缺少Business Intelligence 解决办法 有未提交的事务。是否要在关闭窗口之前提交这些事务? 获取对象属性和值 日志记录 MSSQL之2005版本之后的行号分区妙用:row_number() over(PARTITION BY X1,X2.. ORDER BY X1,X2... ) IIS发布服务时候无法浏览,提示需要MIME注册 深浅COPY之我所理解,望拍砖交流。 windows developer preview 安装体验。 MSSQL之自增列丢失ID找回--粗略解决方案 datagirdview进行数据统计 水晶报表之分页预留空白方便打印信纸 DataGridView数据呈现之行信息--HitTestInfo--用于选择呈现第一行 SQLMETAL使用LINQ自动代码生成工具命令残参数详解 aspnet_compiler.exe 命令参数详解 妙用MSSQL的REVERSE()反转函数显示文件路径的文件名称 2011年上半年总结 windows phone 7 学习初旅1 MSSQL获取指定表的列名信息,描述,数据类型,长度 The product level is insufficient for component "Data Conversion 1"
MSSQL自定义函数之数据格式化为千分位格式
☆用心生活☆ · 2011-04-13 · via 博客园 - ☆用心生活☆

  因为ASP WEB程序转成WINFORM程序,由于数据格式的处理不同导致了一些处理需求重新处理.  

  由于有个需求,需要将一个数字格式化为货币型,但是货币型一般是2位小数, 不是1位,或者3位,甚至更多,不过我这个后面小数位数大于3位的,我没处理,也没千分位分开,就是用逗号分开。比如:123456789.156789,我现在可能需要格式化为:123,456,789.2(1位小数),或者132,465,789.157(3位小数),也有可能是123,456,789.16(2位小数)等形式。

  先分析:1.当数据本身转成1,2,0个小数位的时候,都是可以直接转成货币型,然后,截取小数点。

              2.当数据本身需要转成3位或者更多的时候麻烦就出来了,不能采用1,不过会采用1的大部分,先截取整数部分,转成千分位,然后再把小数位数截取出来,连接成字符串,之后就得到了这样的类型。

分析CODE:

--数据转成货币格式,就是千分位逗号,小数位数之类分析
declare @inputNumber  nvarchar(30)
           
set @inputNumber='123246.456778'

--比如三位小数
--
直接转成数字位数
SELECT CONVERT(NUMERIC(18,3),@inputNumber)
           
--SELECT CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber))

--
SELECT SUBSTRING('WONDER.abc',0,CHARINDEX('.','WONDER.abc'))
--
再截取整数
select SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,
0

,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)
--截取小数部分

select SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))+1

,
len(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))-charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)
--将整数部分转成数字

select
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,
0

,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
),
1
)
--整数部分转成货币千分位

select
convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber
))
,
0

,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),
1
)
--

--截取转成货币千分位后的整数部分
SELECT
SUBSTRING(convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber
))
,
0

,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),
1),0
,
charindex('.'
,
convert(nvarchar(30
),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber
))
,
0

,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),
1
))
)
--合并小数位

    SELECT
   
SUBSTRING(convert(nvarchar(30),
   
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber
))
    ,
0

    ,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
    )),
1),0
,
   
charindex('.'
,
   
convert(nvarchar(30
),
   
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber
))
    ,
0

    ,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
    )),
1
))
    )
   
+'.'

   
+SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
    ,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))+1

    ,
len(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))-charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
    )

分析完毕自己创建自定义函数 :

--格式化数据为千分位等格式,比如:1245.56678,144,5.57
--
参数:@inputNumbe输入字符,@floatCount小数位数,0,1,2,3,4
--
时间:2011-04-13
ALTER function FormatNumeric(@inputNumber nvarchar(30) , @floatCount int)
RETURNS nvarchar(30
)
AS

BEGIN
   
DECLARE @strTemp NVARCHAR(30)
   
--1个小数位

    IF(@floatCount=1)
       
BEGIN

           
--测试数据
            --declare @inputNumber  nvarchar(30)
            --set @inputNumber='123246.456'
            --SELECT CONVERT(NUMERIC(18,1),@inputNumber)
            --SELECT CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber))
            --SELECT CONVERT(NVARCHAR(30) , CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber)) ,1)

           
--SELECT charindex('.','156.23',0)
            --SELECT charindex('.','123,246.50',0)+1
            --SELECT SUBSTRING('123,246.50',1,charindex('.','123,246.50',0)+1)
            SET @strTemp=
            
SUBSTRING(CONVERT(NVARCHAR(30) ,
                            
CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber)) ,1
)
                                ,
1
,
                            
CHARINDEX('.',CONVERT(NVARCHAR(30) ,CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber)) ,1),0)+1
)
           
RETURN @strTemp

       
END
   
--2个小数位
    IF(@FLOATcount=2)
       
BEGIN

           
--SELECT CONVERT(NVARCHAR(30) , CONVERT(MONEY,CONVERT(NUMERIC(18,2),@inputNumber)) ,1)
            SET @strTemp=
            
SUBSTRING(CONVERT(NVARCHAR(30) ,
                            
CONVERT(MONEY,CONVERT(NUMERIC(18,2),@inputNumber)) ,1
)
                                ,
1
,
                            
CHARINDEX('.',CONVERT(NVARCHAR(30) ,CONVERT(MONEY,CONVERT(NUMERIC(18,2),@inputNumber)) ,1),0)+2
)
           
RETURN @strTemp

       
END
--3.无小数
    IF(@FLOATcount=0)
       
BEGIN

       
--SELECT CONVERT(NVARCHAR(30) , CONVERT(MONEY,CONVERT(NUMERIC(18,0),@inputNumber)) ,1)
        SET @strTemp=
        
SUBSTRING(CONVERT(NVARCHAR(30) ,CONVERT(MONEY,CONVERT(NUMERIC(18,0),@inputNumber)) ,1)
                            ,
0
,
                        
CHARINDEX('.',CONVERT(NVARCHAR(30) ,CONVERT(MONEY,CONVERT(NUMERIC(18,0),@inputNumber)) ,1),0
))
       
RETURN @strTemp

   
END
--默认位3位小数
    ELSE
    
BEGIN
    
SET @strTemp=
       
SUBSTRING(convert(nvarchar(30),
           
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber
))
            ,
0

            ,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
            )),
1),0
,
           
charindex('.'
,
           
convert(nvarchar(30
),
           
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber
))
            ,
0

            ,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
            )),
1
))
            )
           
+'.'

           
+SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
            ,
charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))+1

            ,
len(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))-charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))   
            )
    
END

return @strTemp
END--SELECT dbo.FormatNumeric(Fld0055,2) from Pur0099
--
SELECT dbo.FormatNumeric(Fld0055,1) from Pur0099

--后记:

不过在MS的开发环境中,最好还是用string类的函数进行数据格式化,这样速度很快,不会拖累服务器,比如:12346789.15678,格式化为:12346789.15678.ToString('N1'),N1,N2,表示1,2个小数位,因此,在DATAGRIVEW中处理格式化,那就在数据源DATATABLE中的列中格式最好。

发现有的时候方法和诀窍是很重要的,经验也是很重要的。因此,处理过了的东西,你下次处理肯定会有优先考虑那种办法。只是好坏,快慢而也,也许就是结果可能一样。