Domanda

In base a questa domanda: c'è un modo per cifre tonde in un formato amichevole?

LA SFIDA - AGGIORNATO (centinaia rimosso sigla da spec)

Il codice corto dal numero di caratteri che abbreviare un intero (senza decimali).

Codice deve includere il programma completo.

gamma pertinente è da 0 - 9,223,372,036,854,775,807 (il limite superiore per intero con segno a 64 bit).

Il numero di cifre decimali per abbreviazione sarà positivo. Non sarà necessario per calcolare la seguente:. 920535 abbreviated -1 place (che sarebbe qualcosa di simile 0.920535M)

I numeri in luogo decine e centinaia (0-999) dovrebbe non essere abbreviato (l'abbreviazione per il numero 57 ai luoghi 1+ decimali è 5.7dk - è inutile e non amichevole)

.

Ricordare di metà intorno distanti zero (23,5 ottiene arrotondato a 24). arrotondamento è verboten.

Ecco le relative sigle numero:

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 )

SAMPLE ingresso / Uscite (ingressi possono essere passati come argomenti separati):

Il primo argomento sarà il numero intero per abbreviare. Il secondo è il numero di cifre decimali.

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...

risposta originale dalla domanda relativa (JavaScript, non segue spec):

function abbrNum(number, decPlaces) {
    // 2 decimal places => 100, 3 => 1000, etc
    decPlaces = Math.pow(10,decPlaces);

    // Enumerate number abbreviations
    var abbrev = [ "k", "m", "b", "t" ];

    // Go through the array backwards, so we do the largest first
    for (var i=abbrev.length-1; i>=0; i--) {

        // Convert array index to "1000", "1000000", etc
        var size = Math.pow(10,(i+1)*3);

        // If the number is bigger or equal do the abbreviation
        if(size <= number) {
             // Here, we multiply by decPlaces, round, and then divide by decPlaces.
             // This gives us nice rounding to a particular decimal place.
             number = Math.round(number*decPlaces/size)/decPlaces;

             // Add the letter for the abbreviation
             number += abbrev[i];

             // We are done... stop
             break;
        }
    }

    return number;
}
È stato utile?

Soluzione

J, 61 63 65 caratteri

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

Output:

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

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

(La ragione l'uscita è "scatola" come quello è perché J non supporta un elenco consistente di vario tipo)

Spiegazione (da destra a sinistra):

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

Facciamo un nuovo elenco di 3 elementi, utilizzando , di unirsi ([:<.1000^.{.) (il pavimento di base <. 1000 registro ^. del primo {. param. Ci uniamo con la seconda {: param e poi il primo {. param.

Così, dopo il primo bit, abbiamo trasformato diciamo 12345 2 in 1 2 12345

usi ((j.&(1&{)":({.%&1000{:));{&' kMGTPE'@{.) ; per unire le due metà della espressione insieme in una scatola per produrre l'output finale.

La prima metà è ((j.&(1&{)":({.%&1000{:)) che divide (%) l'ultimo numero di input ({:) dal 1000, il primo numero di volte. Quindi imposta il ": precisione utilizzando il secondo numero nella lista di input (1&{).

il secondo tempo {&' kMGTPE'@{. -. Questa utilizza il primo numero per selezionare ({) il carattere appropriato dall'elenco 0-indicizzato di abbreviazioni

Altri suggerimenti

Python 2.x, 78 caratteri

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

Questa versione ( 75 caratteri ) utilizza printf che stamperà zeri in più e segue la regola round-a-pari.

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

Perl 114 111 104 caratteri

Il mio primo inserimento del codice-golf mai!

Gli argomenti previsti dallo standard input: 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];

Output:

  

918.4k


Versione (con spiegazione)

De-golfed:

( $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

JavaScript 114 caratteri

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}

Anche 114 - Utilizzando spidermonkey - Ingresso su 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 - Funzione

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]
}

che diventa anche 99 se si sostituisce il (''+a) con a e la promessa di passare solo le stringhe:)

Rubino - 79 77 75 83 caratteri

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]

Legge dagli argomenti della riga di comando.

74 72 80 caratteri, uscita stampe tra virgolette

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 caratteri, stampe in più zeri

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

In base a questa soluzione , e il codice di esempio.

dc - 75 caratteri

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

Usi Z (numero di cifre) %3 per trovare l'unità. La maggior parte del codice è per impostare l'array unità carattere, il codice vero e proprio è di 39 caratteri. La macro Regola J quando %3 uguale 0, per evitare di stampare 0.918M nel 7 °. test case. Lo fa non rotonda correttamente.

Se si parla dc, sentitevi liberi di migliorarlo.

PHP 57 caratteri

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

Haskell, 126 (senza l'importazione, si tratta di una funzione che prende due argomenti):

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

Expanded:

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

Perl 94 Caratteri

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

Utilizzo:

perl abbreviator.pl 47475782130 2

Output:

47.48G
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top