Ich bezahle nur mit Dollars

14

Wie der Titel - wenn auch diskret - andeutet, bezahle ich nur mit Dollars.

Die Herausforderung

Schreiben Sie eine Funktion / ein Programm, die / das eine Zeichenfolge als Eingabe verwendet. Dabei handelt es sich um einen Geldwert, dem ein Symbol vorangestellt ist. ex) £4.99. Geben Sie dann den gleichen Betrag in USD zurück.

Eingang

Sie erhalten eine Zeichenfolge als Eingabe. Es wird das Währungssymbol gefolgt von einer Zahl mit zwei Dezimalstellen (die sein könnten .00) haben. Es wird entweder Dezimalstellen .und / oder Kommas geben ,, die die Zahl trennen. Die folgenden Währungssymbole kommen in die Eingaben:

Euro: €
Pfund Sterling: £
Yuan Renminbi: ¥

Außerdem wird je nach Währung ein Komma oder ein Dezimalpunkt verwendet, um die "Dollar" von den "Cent" zu trennen:

Euro: #. ###, ##
Pfund Sterling: #, ###. ##
Yuan Renminbi: #, ###. ##

Ausgabe

Sie konvertieren die Eingabe von der durch das Symbol festgelegten Währung in USD, wobei auf zwei Dezimalstellen gerundet wird. Die Ausgabe erfolgt im Format $#,###.##und es werden natürlich mehr Zahlen links von der Ausgabe angezeigt ( BEARBEITEN: Dies bedeutet, dass die Ausgabe genau wie die Eingabe eine beliebige Anzahl von Kommas enthält ). Der von uns verwendete Wechselkurs ist unten angegeben.

Sie können davon ausgehen, dass die Eingabe ein Symbol enthält, das nur eines der oben genannten ( € £ ¥ . ,) ist - dass es immer gültig ist.

Wechselkurse

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

Beispiele

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

Respective output:
$1.51
$5.48
$417,318.42

Letzte Worte

  1. Wenn Sie eines der oben genannten Symbole (€, £, ¥) verwenden, können Sie diese als 1 Byte zählen
  2. Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!
Daniel
quelle
1
Wenn Sie true l10n verwenden möchten, sollte der Renminbi ein Komma-Trennzeichen an der 10k-Marke haben, nicht an der 1k-Marke. (zB 10,0000.15)
Nicht dass Charles am
24
Es ist lustig, dass, wenn Sie diese Frage gestern gepostet haben, der Wechselkurs des englischen £1 : $1.51
Pfunds
1
Ok @Adnan, das mache ich. Erledigt.
Daniel
2
Hmm, ist die Ausgabe korrekt? 1.37 * 1.10 = 1,507 = 1,51(also nicht 1.52) und 4.00 * 1.37 = 5.48(nicht 5.50) und 2782122.78 * 0.15 = 417318.417 = 417318.42(nicht 420165.06) ...: S
Kevin Cruijssen
1
@ KevinCruijssen, ich habe gerade festgestellt, dass sich der Wechselkurs bei der Verwendung von Google zum Konvertieren bereits geändert hat. Repariert.
Daniel

Antworten:

1

Pyth - 54 53 48 47 Bytes

Bedingte Bewerbung vergessen W.

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

Test Suite .

Maltysen
quelle
Hmm .. bin ich es oder ist das eine ziemlich große Antwort für Pyth in Bezug auf Bytes? o.Ô Es ist fast 1/4 meiner Java-Antwort ! (Normalerweise ist es
1/50
1
@ KevinCruijssen Ja, die Formatierung der Zeichenfolgen und die Rohwährungsdaten machen fast die Hälfte der Größe aus.
Maltysen
5

Python 3.6 (Vorabversion), 87

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

Verwendet f-Strings , um das Ergebnis auszuwerten und zu formatieren .

s.translate({46:'',44:''})Entfernt Punkte und Kommas sund macht es zu einem gültigen intLiteral. Anschließend int(...)wird es in das eigentliche intObjekt konvertiert .

Vaultah
quelle
4

Konvex, 56 55 54 Bytes

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

Nun, das kann definitiv gekürzt werden. Probieren Sie es online!

Dank Lynn ein Byte gespart!

Erklärung, wann ich Zugang zu einem Computer bekomme.

GamrCorps
quelle
Wie wäre es [1.1_.27+.15]?
Lynn
@Lynn das ist genial! Vielen Dank!
GamrCorps
"Erklärung, wann ich Zugang zu einem Computer bekomme", was bedeutet, dass dieses kleine Nugget der unglaublichen Unlesbarkeit auf einem mobilen Gerät geschrieben wurde . gut gemacht, gelehrter Gelehrter. gut gemacht.
Strugee
1
@strugee Ja, ich war den ganzen Tag unterwegs, aber ich habe zu diesem Zweck eine CP-1252-Tastatur für mein iPhone hergestellt.
GamrCorps
Warum ist die letzte 55-Byte-Marke durchgestrichen? Auch Tippfehler auf jeden Fall - auf jeden Fall .
User48538
3

Python 3.5, 137 131 121 120 117 Bytes:

(Danke an Maltysen für den Hinweis, 6 Bytes zu sparen (137 -> 131)!)

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

Probieren Sie es online! (Ideone)

R. Kap
quelle
2
Sie müssen nicht Ihre eigene Rundung machen, .format()tut es für Sie, wenn Sie tun${:,.2f}
Maltysen
@Maltysen Danke! Ich wusste nicht, dass ich das machen kann! :)
R. Kap
46:0Ersetzt Punkte durch NUL-Zeichen.
Gewölbe
@vaultah Na und? Es funktioniert für Euro-Eingänge.
R. Kap
@vaultah Nun, es funktioniert einwandfrei auf Ideone und meinem Computer.
R. Kap
3

JavaScript (ES6), 107

Einfach und unkompliziert , wahrscheinlich mehr Golf

Hinweis: In FireFox getestet. Viele Browser (besonders mobile) unterstützen Buggys vontoLocaleString

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

PRÜFUNG

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>

edc65
quelle
Ich konnte das nur mit Firefox testen. Können Sie mir einen Link zu Firefoex geben?
NoOneIsHere
@NoOneIsHere Google "Firefoex", gibt es Ihnen den richtigen Link, auch wenn es falsch geschrieben ist
edc65
3

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

(201 - 2 Bytes aufgrund der Regel " Wenn Sie eines der obigen Symbole (€, £, ¥) verwenden, können Sie diese als 1 Byte zählen ")
Vielen Dank an @Frozn für das Speichern vieler Bytes.

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);}

Ungolfed & Testcode:

Probieren Sie es hier aus.

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"));
  }
}

Ausgabe:

$1.51
$5.48
$417,318.42
Kevin Cruijssen
quelle
2
char c=a.charAt(0)(Alles in allem brauchen Sie überhaupt nicht c, siehe meine Antwort)
edc65
1
Indem Sie das d *aus dem Ternär herausziehen , sparen Sie einige Duplikate. Wie folgt aussieht: d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn
@Frozn Danke. Auch leider /100und *.01ist die gleiche Anzahl von Bytes, und c=='€'?.011:c=='£'?.0137:.0015ist auch genau das gleiche wie bei der /100.
Kevin Cruijssen
1
Ja, das ist schlimm. Aber hier ist die gute Nachricht: Dank der einzigartigen Unicode-Werte der Währungszeichen können Sie diese verkürzen, weil '£' < '¥' < '€'. So können Sie schreiben, c<'¥'?1.37:c>'¥'?1.1:.15was 2 Zeichen kürzer ist.
Frozn
1
Habe gerade gesehen, dass wir nicht dmehr brauchen, da es nur einmal verwendet wird.
Frozn
1

F #, 198 Bytes

(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")

Nicht Golfspieler:

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")

Ich versuche immer noch, F # herauszufinden, daher nimmt der Umgang mit den Tausendertrennzeichen eine Menge Bytes in Anspruch.

Gemäß den Herausforderungsregeln werden die Symbole Euro, Yen und Pfund als jeweils ein Byte gezählt, unabhängig davon, wie Unicode sie intern speichert.

versiegelte Schnittstelle
quelle
1

Python 3.5, 101 98

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

Die Euro-, Pfund- und Yen-Symbole werden gemäß den Herausforderungsregeln als jeweils 1 Byte / Zeichen gezählt.

Anstatt Tausender- und Dezimaltrennzeichen zu übersetzen oder zu interpretieren, werden diese einfach entfernt, um eine einfache Ziffernfolge zu erhalten.

Die Ziffernfolge (nach dem Währungssymbol) wird in eine Ganzzahl umgewandelt.

Das Währungssymbol wird als Index für ein Wörterbuch der Umrechnungskurse verwendet. Die Umrechnung erfolgt durch Multiplikation mit dem Umrechnungskurs und Division durch 10000.

Das Ergebnis wird mit einem führenden Dollarzeichen, zwei Dezimalstellen und Kommas für die Gruppierung formatiert.

PellMell
quelle
Warum löschst du nicht die 0 von 1.10, um 1 Byte zu sparen?
Daniel
Vielleicht kannst du das überspringen. in den Verhältnissen und dividieren durch 1e4
seit dem
0

Python 3, 112 Bytes NICHT WETTBEWERBSFÄHIG

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

Dies ist kein Wettbewerb, da ich nicht der Meinung bin, dass ich meine eigene Frage beantworten darf.

Außerdem hatte ich noch keine Chance, dies auf einem Computer auszuführen, aber es scheint mir, als ob es funktionieren sollte. Ich werde es auf einem Computer ausführen, sobald ich eine Chance habe.

Daniel
quelle
4
Sie sind völlig in Ordnung, um Ihre eigene Frage zu beantworten. Einige Leute finden sogar eine Antwort, bevor sie die Frage selbst stellen. In der Regel werden sie jedoch immer noch von Golfsprachen wie Jelly, Pyth, Pyke und anderen geschlagen. ;)
Kevin Cruijssen
0

PHP, 117 Bytes

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

Dies nutzt eine veraltete Funktion; Ersetzen ereg_replace('[^0-9]'durch preg_replace('%[^\d]%', um den Code vollständig zu modernisieren. fügt 1 Byte hinzu.

Titus
quelle
0

CJam, 54 Bytes

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

Probieren Sie es hier aus!

Fall
quelle
Schöne Antwort und willkommen auf der Seite! Damit Sie wissen, dass es hier einen Online-CJam-Interpreter gibt, können Sie einen Link zu diesem in Ihrem Beitrag erstellen , damit der Leser Ihre Antwort einfacher ausführen / testen kann.
DJMcMayhem