Code-Golf:友好号码缩写器

时间:2010-04-22 15:48:18

标签: language-agnostic code-golf rosetta-stone number-formatting human-readable

基于这个问题:Is there a way to round numbers into a friendly format?

挑战 - 更新! (从规范中删除了数百个缩写)

字符数最短的代码,将缩写整数(无小数)。

代码应包括完整的程序。

相关范围来自0 - 9,223,372,036,854,775,807(有符号64位整数的上限)。

缩写的小数位数为正数。 您无需计算以下内容:920535 abbreviated -1 place(类似于0.920535M)。

数十和数百位(0-999)中的数字从不缩写(571+小数位的缩写{{ 1}} - 这是不必要的,也不友好。)

请记住从零开始一半(23.5四舍五入到24)。银行家的舍入是禁止的。

以下是相关的数字缩写:

<击> 5.7dk h = hundred (10 2
) k = thousand (10 3
) M = million (10 6
) G = billion (10 9
) T = trillion (10 12
) P = quadrillion (10 15
) E = quintillion (10 18

示例输入/输出(输入可以作为单独的参数传递):

第一个参数将是要缩写的整数。第二个是小数位数。

)

相关问题的原始答案(JavaScript,不遵循规范):

12 1                  => 12 // tens and hundreds places are never rounded
1500 2                => 1.5k
1500 0                => 2k // look, ma! I round UP at .5
0 2                   => 0
1234 0                => 1k
34567 2               => 34.57k
918395 1              => 918.4k
2134124 2             => 2.13M
47475782130 2         => 47.48G
9223372036854775807 3 => 9.223E
// ect...

9 个答案:

答案 0 :(得分:10)

J,61 63 65 个字符

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.)

输出:

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.) 1500 0
┌─┬─┐
│2│k│
└─┴─┘

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.) 987654321987654321 4
┌────────┬─┐
│987.6543│P│
└────────┴─┘

(输出被“装箱”的原因是因为J不支持由不同类型组成的列表)

解释(从右到左):

(([:<.1000^.{.),{:,{.)

我们制作了一个新的3元素列表,使用,加入([:<.1000^.{.)(第一个参数<.的内置^.基数1000日{.我们加入第二个参数{:,然后是第一个参数{.

因此,在第一位之后,我们已将12345 2转换为1 2 12345

((j.&(1&{)":({.%&1000{:));{&' kMGTPE'@{.)使用;将表达式的两半连接在一起以生成最终输出。

前半部分是((j.&(1&{)":({.%&1000{:)),它将最后一个输入数字{%)除以1000(第一次)。然后使用输入列表中的第二个数字{:)设置精度":

下半部分1&{ - 这使用第一个数字从0索引的缩写列表中选择({&' kMGTPE'@{.)相应的字符。

答案 1 :(得分:7)

Python 2.x,78个字符

a=input()
i=0
while a>=1e3:a/=1e3;i+=1
print"%g"%round(a,input())+" kMGTPE"[i]

此版本( 75 chars )使用printf,它将打印额外的零并遵循round-to-even规则。

a=input()
i=0
while a>=1e3:a/=1e3;i+=1
print"%%.%df"%input()%a+" kMGTPE"[i]

答案 2 :(得分:5)

Javascript 114 chars

function m(n,d){p=M.pow
d=p(10,d)
i=7
while(i)(s=p(10,i--*3))<=n&&(n=M.round(n*d/s)/d+"kMGTPE"[i])
return n}

另外114 - 使用spidermonkey - 输入STDIN

[n,d]=readline().split(' '),x=n.length,p=Math.pow,d=p(10,d)
x-=x%3
print(Math.round(n*d/p(10,x))/d+" kMGTPE"[x/3])

104 - 功能

function(a,b,c,d){
    c=(''+a).length;
    d=Math.pow;
    b=d(10,b);
    return((a*b/d(10,c-=c%3))+.5|0)/b+' kMGTPE'[c/3]
}

如果将(''+a)替换为a并保证只传递字符串,那么这也会变为99:)

答案 3 :(得分:5)

Perl 114 111 104 chars

我的第一个代号 - 高尔夫球场!

标准输入提供的参数:perl fna.pl 918395 1

($n,$d)=@ARGV;
@n=$n=~/./g;
@s=' kMGTPE'=~/./g;
printf"%.".(@n>3?$d:0)."f%s",$n/(10**($#n-$#n%3)),$s[@n/3];

输出:

  

918.4k


去高尔夫球版(附说明):

( $number, $dp ) = @ARGV;      # Read in arguments from standard input

@digits = split //, $number;   # Populate array of digits, use this to count
                               # how many digits are present

@suffix = split //, ' kMGTPE'; # Generate suffix array

$number/(10**($#n-$#n%3));     # Divide number by highest multiple of 3

$precision = @n>3 ? $dp : 0;   # Determine number of decimal points to print

sprintf "%.".$precision."f%s", # "%.2f" prints to 2 dp, "%.0f" prints integer
        $number, $suffix[@n/3];# Select appropriate suffix

答案 4 :(得分:4)

红宝石 - 79 77 75 83 chars

n,d=ARGV
l=n.to_s.length
printf"%.#{l>3?d:0}f%s",n.to_f/10**(l-l%3)," kMGTPE"[l/3]

从命令行参数读取。

74 72 80个字符,打印输出双引号

n,d=ARGV
l=n.to_s.length
p"%.#{l>3?d:0}f%s"%[n.to_f/10**(l-l%3)," kMGTPE"[l/3]]

66 74个字符,打印额外的零

n,d=ARGV
l=n.to_s.length
p"%.#{d}f%s"%[n.to_f/10**(l-l%3)," kMGTPE"[l/3]]

基于this解决方案和示例代码。

答案 5 :(得分:3)

dc - 75 chars

A7 1:U77 2:U71 3:U84 4:U80 5:U69 6:U[3+r1-r]sJ?sddZd3~d0=Jrsp-Ar^ldk/nlp;UP

使用Z(位数)%3来查找单位。大多数代码用于设置单位字符数组,实际代码是39个字符。当J等于%3时,0宏会进行调整,以避免在第7天打印0.918M。测试用例。它没有正确地圆。

如果您说dc,请随时改进。

答案 6 :(得分:1)

PHP 57字符

for($a=num+1;$a>=1;$a=$a/26)$c=chr(--$a%26+65).$c;echo$c;

答案 7 :(得分:1)

Haskell,126(没有导入,它是一个带有两个参数的函数):

f n p|l>3=showFFloat (Just p) (c n/c 10^(l-w)) [" kMGTPE"!!f]|True=show n where(f,w)=divMod l 3;c=fromIntegral;l=length$show n

展开:

import Numeric

doit :: Integer -> Int -> String
doit n p
    | l > 3 = showFFloat (Just p) d [" kMGTPE" !! f]
    | otherwise = show n
    where
    d = (fromIntegral n) / fromIntegral (10^(l-w))
    (f,w) = divMod l 3
    l = length $ show n

答案 8 :(得分:0)

Perl 94 Chars

($_,$d)=@ARGV;$l=length;@u=' kMGTPE'=~/./g;printf"%.".($l>3?$d:0)."f$u[$l/3]",$_/10**($l-$l%3)

用法:

perl abbreviator.pl 47475782130 2

输出:

47.48G