Płacę tylko dolarami

14

Jak sugeruje tytuł - choć dyskretnie - płacę tylko dolarami.

Wyzwanie

Napisz funkcję / program, który pobiera ciąg wejściowy, który jest wartością pieniężną poprzedzoną symbolem. ex) £4.99. Następnie zwróć tę samą kwotę przeliczoną na USD.

Wejście

Otrzymasz ciąg jako dane wejściowe. Będzie miał symbol waluty, a po nim liczbę z dwoma miejscami dziesiętnymi (które mogą być .00). Będą albo kropki dziesiętne .i / lub przecinki ,oddzielające liczbę. Wprowadzane będą następujące symbole walut:

Euro:
Funt szterling:
Yuan Renminbi: ¥

Będzie też przecinek lub przecinek dziesiętny w zależności od waluty, aby oddzielić „dolary” od „centów”:

Euro: #. ###, ##
Funt szterling: #, ###. ##
Yuan Renminbi: #, ###. ##

Wynik

Przekształcisz dane wejściowe z waluty określonej przez symbol na USD, zaokrąglając do dwóch miejsc po przecinku. Dane wyjściowe będą miały format $#,###.##, a po lewej stronie danych wyjściowych będzie oczywiście więcej liczb ( EDYCJA: oznacza to, że na wyjściu jest dowolna liczba przecinków, podobnie jak na wejściu ). Kurs wymiany walut, którego będziemy używać, znajduje się poniżej.

Możesz założyć, że wejście zawiera symbol, który jest tylko jednym z powyższych (€ £ ¥ . , ) - że zawsze jest poprawny.

Kurs wymiany

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

Przykłady

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

Respective output:
$1.51
$5.48
$417,318.42

Ostatnie słowa

  1. Jeśli użyjesz jednego z powyższych symboli (€, £, ¥), możesz je policzyć jako 1 bajt
  2. To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!
Daniel
źródło
1
Jeśli chcesz użyć prawdziwego l10n, renminbi powinien mieć znak przecinka na znaku 10k, a nie na znaku 1k. (np. 10,0000.15)
Nie to, że Charles
24
To zabawne, że jeśli opublikowałeś wczoraj to pytanie, kurs funta brytyjskiego wyniósłby £1 : $1.51xD
Kevin Cruijssen
1
Ok @Adnan, zrobię to. Gotowy.
Daniel
2
Hmm, czy to wyjście jest poprawne? 1.37 * 1.10 = 1,507 = 1,51(więc nie 1.52) i 4.00 * 1.37 = 5.48(nie 5.50) i 2782122.78 * 0.15 = 417318.417 = 417318.42(nie 420165.06) ...: S
Kevin Cruijssen
1
@KevinCruijssen, właśnie zdałem sobie sprawę, że kiedy korzystam z Google do konwersji, kurs wymiany już się zmienił. Naprawione.
Daniel

Odpowiedzi:

1

Pyth - 54 53 48 47 bajtów

Zapomniałem o zastosowaniu warunkowym W.

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

Pakiet testowy .

Maltysen
źródło
Hmm .. czy to ja, czy jest to dość duża odpowiedź dla Pytha pod względem bajtów? o.Ô To prawie 1/4 mojej odpowiedzi w Javie ! (Zwykle jest to
1/50
1
@KevinCruijssen tak, formatowanie ciągów i nieprzetworzone dane walutowe stanowią prawie połowę tego rozmiaru.
Maltysen
5

Python 3.6 (wersja wstępna), 87

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

Używa ciągów F do oceny wyniku i sformatowania go .

s.translate({46:'',44:''})usuwa kropki i przecinki s, czyniąc z niego prawidłowy intliterał, a następnie int(...)przekształca go w rzeczywisty intobiekt.

sklepienie
źródło
4

Wypukły, 56 55 54 bajtów

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

To zdecydowanie można skrócić. Wypróbuj online!

Oszczędność bajtu dzięki Lynn!

Wyjaśnienie, które należy przyjść, kiedy mogę uzyskać dostęp do komputera.

GamrCorps
źródło
Jak o [1.1_.27+.15]?
Lynn
@Lynn thats genius! Dzięki!
GamrCorps
„Wyjaśnienie, które nastąpi, kiedy będę mógł uzyskać dostęp do komputera”, co sugeruje, że ten samorodek niesamowitej nieczytelności został napisany na urządzeniu mobilnym . dobrze zrobiony, uczony uczony. dobra robota.
strugee
1
@strugee Tak, byłem cały dzień, ale w tym celu zrobiłem klawiaturę CP-1252 dla mojego iPhone'a.
GamrCorps
Dlaczego wykreślono ostatni znak 55 bajtów? Również literówka zdecydowanie - zdecydowanie .
user48538
3

Python 3.5, 137 131 121 120 117 bajtów:

(Podziękowania dla Maltysen za podpowiedź na temat oszczędzania 6 bajtów (137 -> 131)!)

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

Wypróbuj online! (Ideone)

R. Kap
źródło
2
nie musisz robić własnego zaokrąglania, .format()robi to dla ciebie, jeśli to zrobisz${:,.2f}
Maltysen
@Maltysen Thanks! Nie wiedziałem, że mogę to zrobić! :)
R. Kap
46:0zastępuje kropki znakami NUL.
vaultah
@vaultah Co z tego? Działa dla wejść Euro.
R. Kap
@vaultah Cóż, działa idealnie dobrze na Ideone i moim komputerze.
R. Kap
3

JavaScript (ES6), 107

Prosty i bezpośredni , prawdopodobnie bardziej golfowy

Uwaga: testowane w FireFox. Wiele przeglądarek (szczególnie mobilnych) obsługuje błędytoLocaleString

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>

edc65
źródło
Mogłem to przetestować tylko w przeglądarce Firefox. Czy możesz podać mi link do Firefoex?
NoOneIsHere
@NoOneIsHere Google „Firefoex” da ci poprawny link, nawet jeśli jest źle napisany
edc65
3

Java 7, 240 227 215 211 207 202 199 196 bajtów

(201 - 2 bajty z powodu reguły „ Jeśli użyjesz jednego z powyższych symboli (€, £, ¥), możesz policzyć je jako 1 bajt ”)
Dzięki @Frozn za zaoszczędzenie dużej ilości bajtów.

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

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wynik:

$1.51
$5.48
$417,318.42
Kevin Cruijssen
źródło
2
char c=a.charAt(0)(w sumie wcale nie potrzebujesz c, zobacz moją odpowiedź)
edc65
1
Pociągając d *Spośród trójskładnikowego zaoszczędzić trochę powielania. Wygląda następująco: d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn
@Frozn Dzięki. Ponadto, niestety /100i *.01ma taką samą liczbę bajtów, a c=='€'?.011:c=='£'?.0137:.0015także dokładnie taką samą, jak w przypadku /100.
Kevin Cruijssen
1
Tak, to źle. Ale oto dobra wiadomość: dzięki unikalnym wartościom znaków Unicode znaków walutowych możesz go skrócić, ponieważ '£' < '¥' < '€'. W ten sposób możesz pisać o c<'¥'?1.37:c>'¥'?1.1:.152 znaki krótsze.
Frozn
1
Właśnie zobaczyłem, że djuż nie potrzebujemy, ponieważ jest używany tylko raz.
Frozn
1

F #, 198 bajtów

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

Bez gry w golfa:

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

Wciąż próbuję wymyślić F #, więc radzenie sobie z separatorami tysięcy zajmuje dużo bajtów.

Zgodnie z regułami wyzwania symbole euro, jena i funta są liczone jako jeden bajt, pomimo tego, jak Unicode przechowuje je wewnętrznie.

uszczelniony interfejs
źródło
1

Python 3.5, 101 98

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

Symbole euro, funta i jena są liczone jako 1 bajt / znak, zgodnie z regułami wyzwania.

Zamiast tłumaczyć lub interpretować tysiące i separatory dziesiętne, są one po prostu usuwane, aby dać ciąg cyfr.

Ciąg cyfr (po symbolu waluty) jest konwertowany na liczbę całkowitą.

Symbol waluty służy jako indeks do słownika kursów przeliczeniowych; konwersja jest wykonywana przez pomnożenie przez współczynnik konwersji i podzielenie przez 10000.

Wynik jest formatowany wiodącym znakiem dolara, dwoma dokładnościami dziesiętnymi i przecinkami do grupowania.

PellMell
źródło
Dlaczego nie usuwasz 0 z 1.10, aby zapisać 1 bajt?
Daniel
Może możesz pominąć. w stosunkach i podziel przez 1e4
agtoever
0

Python 3, 112 bajtów NIE KONKURENCYJNY

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

To nie konkuruje, ponieważ nie sądzę, że wolno mi odpowiedzieć na własne pytanie.

Ponadto nie miałem jeszcze okazji uruchomić tego na komputerze, ale wydaje mi się, że powinno to działać. Uruchomię go na komputerze, jak tylko będę miał szansę.

Daniel
źródło
4
Możesz w pełni odpowiedzieć na swoje pytanie. Niektórzy ludzie nawet wymyślają odpowiedź przed postawieniem samego pytania. Zwykle jednak wciąż są bici przez golfa, takie jak Jelly, Pyth, Pyke i tym podobne. ;)
Kevin Cruijssen
0

PHP, 117 bajtów

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

Wykorzystuje to przestarzałą funkcję; wymienić ereg_replace('[^0-9]'ze preg_replace('%[^\d]%'aby kod pełni nowoczesny; dodaje 1 bajt.

Tytus
źródło
0

CJam, 54 bajty

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

Wypróbuj tutaj!

walizka
źródło
Ładna odpowiedź i witamy na stronie! Po prostu wiesz, że jest tutaj internetowy tłumacz CJam. Możesz zamieścić link do tego w swoim poście, aby ułatwić czytelnikowi uruchomienie / przetestowanie twojej odpowiedzi.
James