Pago solo con dollari


14

Come suggerisce il titolo - anche se discretamente - suggerisco di pagare solo con dollari.

La sfida

Scrivi una funzione / programma che accetta una stringa come input, che è un valore monetario preceduto da un simbolo. ex) £4.99. Quindi, restituisci lo stesso importo convertito in USD.

Ingresso

Otterrai una stringa come input. Avrà il simbolo della valuta seguito da un numero con due cifre decimali (che potrebbero essere .00). Ci saranno punti decimali .e / o virgole che ,separano il numero. I seguenti simboli di valuta verranno inseriti negli input:

Euro: €
Sterlina: £
Yuan Renminbi: ¥

Inoltre, ci sarà una virgola o un punto decimale a seconda della valuta per separare i 'dollari' dai 'centesimi':

Euro: #. ###, ##
Sterlina: #, ###. ##
Yuan Renminbi: #, ###. ##

Produzione

Converti l'input dalla valuta determinata dal simbolo in USD, arrotondando al secondo decimale. L'output sarà nel formato $#,###.##e ovviamente ci saranno più numeri a sinistra dell'output, se necessario ( EDIT: questo significa che c'è un numero arbitrario di virgole nell'output, proprio come nell'input ). Il tasso di cambio che useremo sarà inferiore.

Si può presumere che l'input contenga un simbolo che è solo uno dei precedenti ( € £ ¥ . ,) - che è sempre valido.

Tassi di cambio

€1 : $1.10
£1 : $1.37
¥1 : $0.15

Esempi

Input:
€1,37
£4.00
¥2,782,122.78

Respective output:
$1.51
$5.48
$417,318.42

Parole finali

  1. Se usi uno dei simboli sopra (€, £, ¥), puoi contarli come 1 byte
  2. Questo è il codice golf, quindi vince il codice più breve in byte!

1
Se si desidera utilizzare l10n vero, renminbi dovrebbe avere un delimitatore virgola sul segno 10k, non sul segno 1k. (ad es. 10,0000.15)
Non che Charles, il

24
È divertente che se avessi pubblicato questa domanda ieri, il tasso di cambio della sterlina inglese sarebbe stato £1 : $1.51xD
Kevin Cruijssen,

1
Ok @Adnan, lo farò. Fatto.
Daniel,

2
Hmm, quell'uscita è corretta? 1.37 * 1.10 = 1,507 = 1,51(così non 1.52) e 4.00 * 1.37 = 5.48(non 5.50) e 2782122.78 * 0.15 = 417318.417 = 417318.42(non 420165.06) ...: S
Kevin Cruijssen,

1
@KevinCruijssen, mi sono appena reso conto che, quando si utilizza Google per la conversione, il tasso di cambio era già cambiato. Aggiustato.
Daniel,

Risposte:


1

Pyth - 54 53 48 47 byte

Dimenticato l'applicazione condizionale W.

.F"${:,.2f}"*v-tXWqhQ\€Q",.")\,@[1.1.15d1.37)Ch

Test Suite .


Hmm .. sono io o è una risposta abbastanza grande per Pyth in termini di byte? o.Ô È quasi 1/4 della mia risposta Java ! (Di solito è 1/50 o giù di lì .. xD)
Kevin Cruijssen,

1
@KevinCruijssen sì, la formattazione delle stringhe e i dati sulla valuta grezza rappresentano quasi la metà della dimensione.
Maltysen,

5

Python 3.6 (pre-release), 87

lambda s:f"${int(s.translate({46:'',44:''})[1:])*[110,15,0,137][ord(s[0])%4]/1e4:,.2f}"

Utilizza f-string per valutare il risultato e formattarlo .

s.translate({46:'',44:''})rimuove punti e virgole da s, rendendolo così un intletterale valido , quindi lo int(...)converte intnell'oggetto reale .


4

Convesso, 56 55 54 byte

(\®\.|,"ö)\e_\'.\++~\"€£¥"#[1.1_.27+.15]=*"%,.2f"\Ø'$\

Bene, questo può sicuramente essere abbreviato. Provalo online!

Salvato un byte grazie a Lynn!

Spiegazione a venire quando posso ottenere l'accesso a un computer.


Che ne dici [1.1_.27+.15]?
Lynn,

@Lynn è geniale! Grazie!
GamrCorps,

"Spiegazione a venire quando potrò accedere a un computer", sottintendendo che quella piccola pepita di straordinaria illeggibilità è stata scritta su un dispositivo mobile . studioso ben fatto, colto. molto bene.
Strugee,

1
@strugee Sì, sono stato fuori tutto il giorno ma a questo scopo ho creato una tastiera CP-1252 per il mio iPhone.
GamrCorps il

Perché gli ultimi 55 byte vengono cancellati? Inoltre, devi assolutamente scrivere - sicuramente .
user48538

3

Python 3.5, 137 131 121 120 117 byte:

(Grazie a Maltysen per un suggerimento su come salvare 6 byte (137 -> 131)!)

lambda u:'${:,.2f}'.format(float(u[1:].translate([{44:''},{44:46,46:''}]['€'in u]))*{'€':1.1,'£':1.37,'¥':.15}[u[0]])

Provalo online! (Ideone)


2
non devi fare il tuo arrotondamento, lo .format()fa per te se lo fai${:,.2f}
Maltysen,

@Maltysen Grazie! Non sapevo di poterlo fare! :)
R. Kap

46:0sostituisce i punti con caratteri NUL.
vaultah,

@vaultah E allora? Funziona con ingressi Euro.
R. Kap,

@vaultah Beh, funziona perfettamente su Ideone e sul mio computer.
R. Kap,

3

JavaScript (ES6), 107

Semplice e diretto , probabilmente più golfabile

Nota: testato su FireFox. Molti browser (in particolare i dispositivi mobili) hanno un supporto errato ditoLocaleString

a=>(a.replace(/\D/g,'')/1e4*(a<'¥'?137:a>'€'?110:15)).toLocaleString('en',{style:'currency',currency:'USD'})

TEST

function test()
{
  var i=I.value
  var F=a=>(a.replace(/\D/g,'')/1e4*(a<'¥'?137:a>'€'?110:15)).toLocaleString('en',{style:'currency',currency:'USD'})
  O.textContent=F(i)
}

test()
<input id=I value='¥2,782,122.78' oninput='test()'>
<pre id=O></pre>


Ho potuto testarlo solo su Firefox. Potete darmi un link a Firefoex?
NoOneIsHere il

@NoOneIsHere Google "Firefoex", ti darà il link corretto anche se è scritto male
edc65

3

Java 7, 240 227 215 211 207 202 199 196 byte

(201 - 2 byte a causa della regola " Se usi uno dei simboli sopra (€, £, ¥), puoi contarli come 1 byte ")
Grazie a @Frozn per aver salvato molti byte.

String c(String a){int c=a.charAt(0);return java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US).format(new Long(a.substring(1).replaceAll(",|\\.",""))*(c<'¥'?1.37:c>'¥'?1.1:.15)/100);}

Codice non testato e test:

Provalo qui.

class Main{
  static String c(String a){
    int c = a.charAt(0);
    return java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US)
        .format(new Long(a.substring(1).replaceAll(",|\\.","")) *
                 (c < '¥'
                   ? 1.37
                   : c > '¥'
                     ? 1.1
                     : .15
                  ) / 100);
  }

  public static void main(String[] a){
    System.out.println(c("€1,37"));
    System.out.println(c("£4.00"));
    System.out.println(c("¥2,782,122.78"));
  }
}

Produzione:

$1.51
$5.48
$417,318.42

2
char c=a.charAt(0)(tutto sommato non è necessario c, vedere la mia risposta)
edc65,

1
Tirando d *fuori dal ternario si salva qualche duplicazione. Assomiglia a questo: d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn,

@Frozn Grazie. Inoltre, purtroppo /100ed *.01è la stessa quantità di byte, ed c=='€'?.011:c=='£'?.0137:.0015è anche l'esatto stessi con il /100.
Kevin Cruijssen,

1
Sì, questo è male. Ma ecco la buona notizia: grazie ai valori unicode unici dei segni di valuta puoi accorciarli perché '£' < '¥' < '€'. Quindi puoi scrivere c<'¥'?1.37:c>'¥'?1.1:.15che è più corto di 2 caratteri.
Frozn,

1
Ho appena visto che non ci servono dpiù perché viene usato una sola volta.
Frozn,

1

F #, 198 byte

(s:string)="$"+(System.Double.Parse(if s.[0]='€'then s.[1..].Replace(".","").Replace(',','.')else s.[1..].Replace(",",""))*(if s.[0]='€'then 1.1 else if s.[0]='£'then 1.37 else 0.15)).ToString("N2")

Un-golfed:

let IOnlyUseDollars(s : string) = 
    let cur = s.[0]
    let str = if cur = '€' then s.[1..].Replace(".","").Replace(',', '.') else s.[1..].Replace(",","")
    let amt = System.Double.Parse(str)
    let dol = amt * (if cur = '€' then 1.1 else if cur = '£' then 1.37 else 0.15)
    "$" + dol.ToString("N2")

Sto ancora cercando di capire F #, quindi gestire i separatori delle migliaia sta occupando molti byte.

Secondo le regole della sfida, i simboli Euro, Yen e Pound contano come un byte ciascuno, nonostante Unicode li memorizzi internamente.


1

Python 3.5, 101 98

lambda x:'${:,.2f}'.format(int(x[1:].translate({44:'',46:''}))*{'€':110,'£':137,'¥':15}[x[0]]/1e4)

I simboli Euro, Sterlina e Yen sono conteggiati come 1 byte / carattere ciascuno, secondo le regole della sfida.

Invece di tradurre tra o interpretare migliaia e separatori decimali, questi vengono semplicemente eliminati per fornire una stringa di cifre semplici.

La stringa di cifre (dopo il simbolo della valuta) viene convertita in un numero intero.

Il simbolo di valuta viene utilizzato come indice in un dizionario di tassi di conversione; la conversione viene eseguita moltiplicando per il tasso di conversione e dividendo per 10000.

Il risultato è formattato con un segno di dollaro iniziale, due posizioni decimali di precisione e virgole per il raggruppamento.


Perché non elimini lo 0 da 1.10 per salvare 1 byte?
Daniel,

Forse puoi saltare il. nei rapporti e dividere per 1e4
agtoever il

0

Python 3, 112 byte NON COMPETING

def c(x):x=x.translate(None,",.");print“$”+‘{:,.2f}’.format([1.1,1.37,0.15][“€£¥”.index(x[0])]*int(x[1:])/100,2)

Questo non è in competizione perché non credo di poter rispondere alla mia domanda.

Inoltre, non ho ancora avuto la possibilità di eseguirlo su un computer, ma mi sembra che dovrebbe funzionare. Lo eseguirò su un computer non appena ne avrò la possibilità.


4
Stai benissimo a rispondere alla tua domanda. Alcune persone arrivano anche a una risposta prima di fare la domanda stessa. Di solito vengono comunque battuti dai linguaggi del golf come Jelly, Pyth, Pyke e simili. ;)
Kevin Cruijssen,

0

PHP, 117 byte

function f($s){return'$'.number_format(ereg_replace('[^0-9]','',substr($s,1))*[E=>.011,P=>.0137,Y=>.0015][$s[0]],2);}

Questo fa uso di una funzione deprecata; sostituirlo ereg_replace('[^0-9]'con preg_replace('%[^\d]%'per rendere il codice completamente moderno; aggiunge 1 byte.


0

CJam, 54 byte

'$q(\",."-de-2\"€£¥"#[1.1 1.37 .15]=*2mOs'./~\3/',*'.@

Provalo qui!


Bella risposta, e benvenuta nel sito! Solo per quello che sai, c'è un interprete CJam online qui Puoi collegarti a quello nel tuo post per rendere più semplice l'esecuzione / test della tua risposta da parte del lettore.
James,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.