Python论坛  - 讨论区

标题:[python-chinese] 格式化float的问题?

2007年11月23日 星期五 14:32

23号 no.0023在gmail.com
星期五 十一月 23 14:32:26 HKT 2007

1234567890987654321.123456789
如何格式化成为:1,234,567,890,987,654,321.123457 的字符串?

--
Best Regards,
       No.23
----
My Blog: http://blog.chinaunix.net/u1/42287/

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 14:53

Leo Jay python.leojay在gmail.com
星期五 十一月 23 14:53:47 HKT 2007

On Nov 23, 2007 2:32 PM, 23号 <no.0023在gmail.com> wrote:
> 1234567890987654321.123456789
> 如何格式化成为:1,234,567,890,987,654,321.123457 的字符串?
>


这样行不:

def f(num):
        n = num.split('.')
        if len(n[0]) <= 3:
                return num

        n[0] = f(n[0][:-3]) + ',' + n[0][-3:]
        return '.'.join(n)

def main():
        test = [('123456',      '123,456'),
                ('123',         '123'),
                ('1',           '1'),
                ('1.123456',    '1.123456'),
                ('1234567890',  '1,234,567,890'),
                ('1234567890.1234567890', '1,234,567,890.1234567890')]


        for a,b in test:
                print '%s --> %s' % (a, f(a))
                assert f(a) == b

main()


-- 
Best Regards,
Leo Jay

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 14:59

haur hekun06在gmail.com
星期五 十一月 23 14:59:40 HKT 2007

django×Ô´øÁËÒ»¸ö´¦ÀíÕâ¸öµÄintcomma·½·¨
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071123/c086f31f/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 14:59

@@ askfor在gmail.com
星期五 十一月 23 14:59:51 HKT 2007

def dollar(f):
  if f < 0:     # pull the sign out now so I know where to stop
    sign = "-"  # when going bacwards
    f = -f
  else:
    sign = ""

  s = "%.2f" % f
  # -6 is the thousand's place  --  987654.21
  # -3 goes back 1000 at a time
  # stop at 0 instead of -1 so "999.99" doesn't lead with a ",".
  for i in range(len(s)-6, 0, -3):  # -6 is the first thousands place
    s = s[:i] + "," + s[i:]         # Go back 1000 at a time
  return sign + s

>>>* for i in (0, .9, 1, 10, 99.99, 100.00, 100.0, 999.99, 1000.,
*  1000.00, 1000000000L, -0.01, -0.9, -1, -99.9, -100, -999.99, -1000.00,
  -123456789):
...  print i, dollar(i)
...
0 0.00
0.9 0.90
1 1.00
10 10.00
99.99 99.99
100.0 100.00
100.0 100.00
999.99 999.99
1000.0 1,000.00
1000.0 1,000.00
1000000000L 1,000,000,000.00
-0.01 -0.01
-0.9 -0.90
-1 -1.00
-99.9 -99.90
-100 -100.00
-999.99 -999.99
-1000.0 -1,000.00
-123456789 -123,456,789.00


On 11/23/07, Leo Jay <python.leojay在gmail.com> wrote:
>
> On Nov 23, 2007 2:32 PM, 23ºÅ <no.0023在gmail.com> wrote:
> > 1234567890987654321.123456789
> > ÈçºÎ¸ñʽ»¯³ÉΪ£º1,234,567,890,987,654,321.123457 µÄ×Ö·û´®?
> >
>
>
> ÕâÑùÐв»£º
>
> def f(num):
>        n = num.split('.')
>        if len(n[0]) <= 3:
>                return num
>
>        n[0] = f(n[0][:-3]) + ',' + n[0][-3:]
>        return '.'.join(n)
>
> def main():
>        test = [('123456',      '123,456'),
>                ('123',         '123'),
>                ('1',           '1'),
>                ('1.123456',    '1.123456'),
>                ('1234567890',  '1,234,567,890'),
>                ('1234567890.1234567890', '1,234,567,890.1234567890')]
>
>
>        for a,b in test:
>                print '%s --> %s' % (a, f(a))
>                assert f(a) == b
>
> main()
>
>
> --
> Best Regards,
> Leo Jay
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071123/3df0c964/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 15:00

@@ askfor在gmail.com
星期五 十一月 23 15:00:09 HKT 2007

gooµÄ¡£

On 11/23/07, @@ <askfor在gmail.com> wrote:
>
> def dollar(f):
>   if f < 0:     # pull the sign out now so I know where to stop
>     sign = "-"  # when going bacwards
>     f = -f
>   else:
>     sign = ""
>
>   s = "%.2f" % f
>   # -6 is the thousand's place  --  987654.21
>   # -3 goes back 1000 at a time
>   # stop at 0 instead of -1 so "999.99" doesn't lead with a ",".
>   for i in range(len(s)-6, 0, -3):  # -6 is the first thousands place
>     s = s[:i] + "," + s[i:]         # Go back 1000 at a time
>   return sign + s
>
> >>>* for i in (0, .9, 1, 10, 99.99, 100.00, 100.0, 999.99, 1000.,
> *  1000.00, 1000000000L, -0.01, -0.9 , -1, -99.9, -100, -999.99, -1000.00,
>   -123456789):
> ...  print i, dollar(i)
> ...
> 0 0.00
> 0.9 0.90
> 1 1.00
> 10 10.00
> 99.99 99.99
> 100.0 100.00
> 100.0 100.00
> 999.99 999.99
> 1000.0 1,000.00
> 1000.0 1,000.00
> 1000000000L 1,000,000,000.00
> -0.01 -0.01
> -0.9 -0.90
> -1 -1.00
> -99.9 -99.90
> -100 -100.00
> -999.99 -999.99
> -1000.0 -1,000.00
> -123456789 -123,456,789.00
>
>
> On 11/23/07, Leo Jay <python.leojay在gmail.com> wrote:
> >
> > On Nov 23, 2007 2:32 PM, 23ºÅ <no.0023在gmail.com> wrote:
> > > 1234567890987654321.123456789
> > > ÈçºÎ¸ñʽ»¯³ÉΪ£º1,234,567,890,987,654,321.123457 µÄ×Ö·û´®?
> > >
> >
> >
> > ÕâÑùÐв»£º
> >
> > def f(num):
> >        n = num.split('.')
> >        if len(n[0]) <= 3:
> >                return num
> >
> >        n[0] = f(n[0][:-3]) + ',' + n[0][-3:]
> >        return '.'.join(n)
> >
> > def main():
> >        test = [('123456',      '123,456'),
> >                ('123',         '123'),
> >                ('1',           '1'),
> >                ('1.123456',    '1.123456'),
> >                ('1234567890',  '1,234,567,890'),
> >                ('1234567890.1234567890 ', '1,234,567,890.1234567890')]
> >
> >
> >        for a,b in test:
> >                print '%s --> %s' % (a, f(a))
> >                assert f(a) == b
> >
> > main()
> >
> >
> > --
> > Best Regards,
> > Leo Jay
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071123/bdcfa60d/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 15:03

haur hekun06在gmail.com
星期五 十一月 23 15:03:48 HKT 2007

´íÁË£¬ÄǸöÊÇÕûÊýµÄ
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071123/e48a78ba/attachment-0001.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 15:04

@@ askfor在gmail.com
星期五 十一月 23 15:04:30 HKT 2007

>>> locale.setlocale(locale.LC_ALL,"en")
'English_United States.1252'
>>> locale.format('%.2f', 5555555555555.5555, 3)
'5,555,555,555,555.56'
>>>

On 11/23/07, @@ <askfor在gmail.com> wrote:
>
> gooµÄ¡£
>
> On 11/23/07, @@ <askfor在gmail.com> wrote:
> >
> > def dollar(f):
> >   if f < 0:     # pull the sign out now so I know where to stop
> >     sign = "-"  # when going bacwards
> >     f = -f
> >   else:
> >     sign = ""
> >
> >   s = "%.2f" % f
> >   # -6 is the thousand's place  --  987654.21
> >   # -3 goes back 1000 at a time
> >   # stop at 0 instead of -1 so "999.99 " doesn't lead with a ",".
> >   for i in range(len(s)-6, 0, -3):  # -6 is the first thousands place
> >     s = s[:i] + "," + s[i:]         # Go back 1000 at a time
> >   return sign + s
> >
> > >>>* for i in (0, .9, 1, 10, 99.99, 100.00, 100.0, 999.99, 1000.,
> > *  1000.00, 1000000000L, -0.01, -0.9 , -1, -99.9, -100, -999.99, -
> > 1000.00,
> >   -123456789):
> > ...  print i, dollar(i)
> > ...
> > 0 0.00
> > 0.9 0.90
> > 1 1.00
> > 10 10.00
> > 99.99 99.99
> > 100.0 100.00
> > 100.0 100.00
> > 999.99 999.99
> > 1000.0 1,000.00
> > 1000.0 1,000.00
> > 1000000000L 1,000,000,000.00
> > -0.01 -0.01
> > -0.9 -0.90
> > -1 -1.00
> > -99.9 -99.90
> > -100 -100.00
> > -999.99 -999.99
> > -1000.0 -1,000.00
> > -123456789 -123,456,789.00
> >
> >
> > On 11/23/07, Leo Jay <python.leojay在gmail.com > wrote:
> > >
> > > On Nov 23, 2007 2:32 PM, 23ºÅ < no.0023在gmail.com> wrote:
> > > > 1234567890987654321.123456789
> > > > ÈçºÎ¸ñʽ»¯³ÉΪ£º1,234,567,890,987,654,321.123457 µÄ×Ö·û´®?
> > > >
> > >
> > >
> > > ÕâÑùÐв»£º
> > >
> > > def f(num):
> > >        n = num.split('.')
> > >        if len(n[0]) <= 3:
> > >                return num
> > >
> > >        n[0] = f(n[0][:-3]) + ',' + n[0][-3:]
> > >        return '.'.join(n)
> > >
> > > def main():
> > >        test = [('123456',      '123,456'),
> > >                ('123',         '123'),
> > >                ('1',           '1'),
> > >                ('1.123456',    '1.123456'),
> > >                ('1234567890',  '1,234,567,890'),
> > >                ('1234567890.1234567890 ', '1,234,567,890.1234567890')]
> > >
> > >
> > >        for a,b in test:
> > >                print '%s --> %s' % (a, f(a))
> > >                assert f(a) == b
> > >
> > > main()
> > >
> > >
> > > --
> > > Best Regards,
> > > Leo Jay
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to
> > > python-chinese-request在lists.python.cn
> > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071123/8d5e7dc0/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 15:30

Xie Yanbo xieyanbo在gmail.com
星期五 十一月 23 15:30:14 HKT 2007

On Nov 23, 2007 2:32 PM, 23号 <no.0023在gmail.com> wrote:
> 1234567890987654321.123456789
> 如何格式化成为:1,234,567,890,987,654,321.123457 的字符串?

下面是我自己用的代码:

import re

def integer(i):
    return FormatWithCommas("%d", i)

def percent(f):
    return FormatWithCommas("%.02f%%", f)

def currency(f):
    return FormatWithCommas("%.02f", f)

re_digits_nondigits = re.compile(r'\d+|\D+')
def FormatWithCommas(format, value):
    """
    >>> FormatWithCommas('%.4f', .1234)
    '0.1234'
    >>> FormatWithCommas('%i', 100)
    '100'
    >>> FormatWithCommas('$%.4f', -1234567.5678)
    '$-1,234,567.5678'
    """

    def _commafy(s):
        r = []
        for i, c in enumerate(reversed(s)):
            if i and (not (i % 3)):
                r.insert(0, ',')
            r.insert(0, c)
        return ''.join(r)

    parts = re_digits_nondigits.findall(format % (value,))
    for i in xrange(len(parts)):
        s = parts[i]
        if s.isdigit():
            parts[i] = _commafy(s)
            break
    return ''.join(parts)

针对你的需要,首先这个浮点数太大,python无法保存足够的精度,所以只能
把它当做字符串处理。另外小数点后精度为6位,这部分需要单独处理。最后
大致应该是这样:
>>> n = '1234567890987654321.123456789'
>>> round, decimal = s.split('.')
>>> FormatWithCommas('%s', round) #整数部分
'1,234,567,890,987,654,321'
>>> ('%.6f'%float('.'+decimal))[1:] #小数部分
'.123457'
>>> FormatWithCommas('%s', round)+('%.6f'%float('.'+decimal))[1:] #合起来得到结果
'1,234,567,890,987,654,321.123457'

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 15:46

Xie Yanbo xieyanbo在gmail.com
星期五 十一月 23 15:46:10 HKT 2007

On Nov 23, 2007 3:04 PM, @@ <askfor在gmail.com> wrote:
> >>> locale.setlocale(locale.LC_ALL,"en")
> 'English_United States.1252'
> >>> locale.format('%.2f', 5555555555555.5555, 3)
> '5,555,555,555,555.56'

这确实是一个可行的方法,但一个大问题是,代码运行的环境可能是对locale
很敏感的,比如web系统,来回切换locale有可能带来莫名其妙的问题。所以
有时只能舍近求远,自己写处理函数了。

另外,网上有很多人贡献了自己的代码,搜索一下就能找到好东西。我用的
FormatWithCommas就是取自ASPN,作者是Manuel Garcia,对我很合用 :)

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 15:54

23号 no.0023在gmail.com
星期五 十一月 23 15:54:27 HKT 2007

import re

def commify(ns):
    while True:
        (ns, count) = re.subn(r'^([-+]?\d+)(\d{3})', r'\1,\2', ns)
        if count == 0: break
    return ns

bbs的答案。


On 11/23/07, Xie Yanbo <xieyanbo在gmail.com> wrote:
> On Nov 23, 2007 3:04 PM, @@ <askfor在gmail.com> wrote:
> > >>> locale.setlocale(locale.LC_ALL,"en")
> > 'English_United States.1252'
> > >>> locale.format('%.2f', 5555555555555.5555, 3)
> > '5,555,555,555,555.56'
>
> 这确实是一个可行的方法,但一个大问题是,代码运行的环境可能是对locale
> 很敏感的,比如web系统,来回切换locale有可能带来莫名其妙的问题。所以
> 有时只能舍近求远,自己写处理函数了。
>
> 另外,网上有很多人贡献了自己的代码,搜索一下就能找到好东西。我用的
> FormatWithCommas就是取自ASPN,作者是Manuel Garcia,对我很合用 :)
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese



-- 
Best Regards,
    No.23
----
http://blog.chinaunix.net/u1/42287

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 16:03

limodou limodou在gmail.com
星期五 十一月 23 16:03:03 HKT 2007

On Nov 23, 2007 3:54 PM, 23号 <no.0023在gmail.com> wrote:
> import re
>
> def commify(ns):
>     while True:
>         (ns, count) = re.subn(r'^([-+]?\d+)(\d{3})', r'\1,\2', ns)
>         if count == 0: break
>     return ns
>
> bbs的答案。
>
思路很有意思,不过就是性能太低了。

-- 
I like python!
UliPad <>: http://code.google.com/p/ulipad/
meide <>: http://code.google.com/p/meide/
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 16:08

haur hekun06在gmail.com
星期五 十一月 23 16:08:15 HKT 2007

ÕýÔòÌ«Ç¿ÁË
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071123/a6e08a2c/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 16:33

Xian Chen hoganxian在gmail.com
星期五 十一月 23 16:33:19 HKT 2007

ÄãÊÇ˵Õâ¸öÕýÔòдµÄЧÂʵͣ¬»¹ÊDZ¾ÉíÕýÔòЧÂʾ͵ͣ¿

On Nov 23, 2007 4:03 PM, limodou <limodou在gmail.com> wrote:

> On Nov 23, 2007 3:54 PM, 23ºÅ <no.0023在gmail.com> wrote:
> > import re
> >
> > def commify(ns):
> >     while True:
> >         (ns, count) = re.subn(r'^([-+]?\d+)(\d{3})', r'\1,\2', ns)
> >         if count == 0: break
> >     return ns
> >
> > bbsµÄ´ð°¸¡£
> >
> ˼·ºÜÓÐÒâ˼£¬²»¹ý¾ÍÊÇÐÔÄÜÌ«µÍÁË¡£
>
> --
> I like python!
> UliPad <>: http://code.google.com/p/ulipad/
> meide <>: http://code.google.com/p/meide/
> My Blog: http://www.donews.net/limodou
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071123/9b275008/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 16:44

haur hekun06在gmail.com
星期五 十一月 23 16:44:30 HKT 2007

¸Õ²ÅÐÞ¸ÄÁËϲÎÊý£¬»úÆ÷¶¼¿ì¶¯²»ÁËÁË£¬Õâ¸öÕýÔò²»¿¿Æ×
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071123/caa12a8f/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 17:37

23号 no.0023在gmail.com
星期五 十一月 23 17:37:56 HKT 2007

试了一下,还可以。


On 11/23/07, haur <hekun06在gmail.com> wrote:
> 刚才修改了下参数,机器都快动不了了,这个正则不靠谱
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>


-- 
Best Regards,
    No.23
----
http://blog.chinaunix.net/u1/42287

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号