Saya hanya membayar dengan dolar

14

Seperti judul - meskipun secara rahasia - mengisyaratkan, saya hanya membayar dengan dolar.

Tantangan

Tulis fungsi / program yang mengambil string sebagai input, yang merupakan nilai moneter yang didahului oleh simbol. ex) £4.99. Kemudian, kembalikan jumlah yang sama dikonversi ke USD.

Memasukkan

Anda akan mendapatkan string sebagai input. Ini akan memiliki simbol mata uang diikuti oleh angka dengan dua tempat desimal (yang bisa jadi .00). Akan ada titik desimal .dan / atau koma yang ,memisahkan angka. Simbol mata uang berikut akan muncul pada input:

Euro: €
Pound Sterling: £
Yuan Renminbi: ¥

Juga, akan ada koma atau titik desimal tergantung pada mata uang untuk memisahkan 'dolar' dari 'sen':

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

Keluaran

Anda akan mengonversi input dari mata uang yang ditentukan oleh simbol ke USD, membulatkan ke dua tempat desimal. Output akan berada dalam format $#,###.##, dan tentu saja akan ada lebih banyak angka di sebelah kiri output jika perlu ( EDIT: ini berarti bahwa ada jumlah koma yang berubah-ubah dalam output, sama seperti pada input ). Nilai tukar mata uang yang akan kami gunakan adalah di bawah ini.

Anda dapat mengasumsikan bahwa input berisi simbol yang hanya salah satu di atas ( € £ ¥ . ,) - yang selalu valid.

Nilai tukar

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

Contohnya

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

Respective output:
$1.51
$5.48
$417,318.42

Kata-kata terakhir

  1. Jika Anda menggunakan salah satu simbol di atas (€, £, ¥), Anda dapat menghitungnya sebagai 1 byte
  2. Ini kode golf, jadi kode terpendek dalam byte menang!
Daniel
sumber
1
Jika Anda ingin menggunakan true l10n, renminbi harus memiliki pembatas koma pada tanda 10k, bukan pada tanda 1k. (mis. 10,0000.15)
Bukan berarti Charles
24
Lucu jika Anda memposting pertanyaan ini kemarin, nilai tukar Pound Inggris akan menjadi £1 : $1.51xD
Kevin Cruijssen
1
Ok @ Adnan, aku akan melakukannya. Selesai
Daniel
2
Hmm, apakah output itu benar? 1.37 * 1.10 = 1,507 = 1,51(tidak 1.52) dan 4.00 * 1.37 = 5.48(tidak 5.50) dan 2782122.78 * 0.15 = 417318.417 = 417318.42(tidak 420165.06) ...: S
Kevin Cruijssen
1
@KevinCruijssen, saya baru menyadari bahwa, ketika menggunakan Google untuk mengonversi, nilai tukar sudah berubah. Memperbaikinya.
Daniel

Jawaban:

1

Pyth - 54 53 48 47 byte

Lupa tentang aplikasi bersyarat W.

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

Test Suite .

Maltysen
sumber
Hmm .. apakah ini saya atau ini jawaban yang cukup besar untuk Pyth dalam hal byte? o.Ô Hampir 1/4 dari jawaban Java saya ! (Biasanya ini 1/50 atau lebih .. xD)
Kevin Cruijssen
1
@KevinCruijssen ya, pemformatan string dan data mata uang mentah hampir mencapai setengah ukuran.
Maltysen
5

Python 3.6 (pra-rilis), 87

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

Menggunakan f-string untuk mengevaluasi hasil dan memformatnya .

s.translate({46:'',44:''})menghilangkan titik dan koma s, sehingga menjadikannya intliteral yang valid , lalu int(...)mengubahnya menjadi intobjek yang sebenarnya .

kubah
sumber
4

Cembung, 56 55 54 byte

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

Nah, ini pasti bisa dipersingkat. Cobalah online!

Menyimpan satu byte berkat Lynn!

Penjelasan yang akan datang ketika saya bisa mendapatkan akses ke komputer.

GamrCorps
sumber
Bagaimana dengan [1.1_.27+.15]?
Lynn
@ Lynn thats genius! Terima kasih!
GamrCorps
"Penjelasan yang akan datang ketika saya bisa mendapatkan akses ke komputer," menyiratkan bahwa nugget kecil yang tidak dapat dibaca itu ditulis pada perangkat seluler . dilakukan dengan baik, sarjana terpelajar. sudah selesai dilakukan dengan baik.
strugee
1
@ Strugee Ya, saya sudah keluar sepanjang hari tapi saya telah membuat keyboard CP-1252 untuk iPhone saya untuk tujuan ini.
GamrCorps
Mengapa tanda 55 byte terakhir muncul? Juga, salah ketik di definetely - pasti .
user48538
3

Python 3.5, 137 131 121 120 117 byte:

(Terima kasih kepada Maltysen untuk petunjuk menghemat 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]])

Cobalah secara Online! (Ideone)

R. Kap
sumber
2
Anda tidak perlu melakukan pembulatan Anda sendiri, .format()melakukannya untuk Anda jika Anda melakukannya${:,.2f}
Maltysen
@Maltysen Terima kasih! Saya tidak tahu saya bisa melakukan itu! :)
R. Kap
46:0mengganti titik dengan karakter NUL.
vaultah
@ vaultah Jadi apa? Ini berfungsi untuk input Euro.
R. Kap
@ vaultah Yah, ini berfungsi dengan baik di Ideone dan komputer saya.
R. Kap
3

JavaScript (ES6), 107

Sederhana dan mudah , mungkin lebih golf

Catatan: diuji dalam FireFox. Banyak browser (terutama yang bergerak) memiliki dukungan buggytoLocaleString

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

UJI

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
sumber
Saya hanya bisa menguji ini di Firefox. Bisakah Anda memberi saya tautan ke Firefoex?
NoOneIsHere
@NoOneIsHere Google "Firefoex", ini akan memberi Anda tautan yang benar bahkan jika itu salah eja
edc65
3

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

(201 - 2 byte karena aturan " Jika Anda menggunakan salah satu simbol di atas (€, £, ¥), Anda dapat menghitungnya sebagai 1 byte ")
Terima kasih kepada @Frozn untuk menyimpan banyak 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);}

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

$1.51
$5.48
$417,318.42
Kevin Cruijssen
sumber
2
char c=a.charAt(0)(semuanya Anda tidak perlu csama sekali, lihat jawaban saya)
edc65
1
Dengan menarik d *keluar terner, Anda menyimpan duplikasi. Looks seperti ini: d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn
@Frozn Terima kasih. Juga, sayangnya /100dan *.01jumlah byte yang sama, dan c=='€'?.011:c=='£'?.0137:.0015juga sama persis dengan /100.
Kevin Cruijssen
1
Ya itu buruk. Tapi ini berita baiknya: Berkat nilai unicode unik dari tanda mata uang, Anda dapat mempersingkatnya '£' < '¥' < '€'. Dengan demikian Anda dapat menulis c<'¥'?1.37:c>'¥'?1.1:.15yang lebih pendek 2 karakter.
Frozn
1
Hanya melihat kita tidak perlu dlagi karena hanya digunakan sekali.
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")

Tidak Golf:

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

Saya masih mencoba mencari tahu F #, jadi berurusan dengan ribuan separator membutuhkan banyak byte.

Menurut aturan tantangan, simbol Euro, Yen, dan Pound dihitung sebagai masing-masing satu byte, terlepas dari bagaimana Unicode menyimpannya secara internal.

antarmuka disegel
sumber
1

Python 3.5, 101 98

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

Simbol Euro, Pound, dan Yen masing-masing dihitung sebagai 1 byte / karakter, sesuai aturan tantangan.

Alih-alih menerjemahkan di antara atau menafsirkan ribuan dan pemisah desimal, ini hanya dilucuti untuk memberikan string digit sederhana.

Digit string (setelah simbol mata uang) dikonversi ke integer.

Simbol mata uang digunakan sebagai indeks ke kamus tingkat konversi; konversi dilakukan dengan mengalikan dengan tingkat konversi dan membaginya dengan 10.000.

Hasilnya diformat dengan tanda dolar terkemuka, dua tempat desimal presisi, dan koma untuk pengelompokan.

Tdk teratur
sumber
Mengapa Anda tidak menghapus 0 dari 1,10 untuk menghemat 1 byte?
Daniel
Mungkin Anda bisa melewatkan. dalam rasio dan dibagi dengan 1e4
agtoever
0

Python 3, 112 byte TIDAK BERSAING

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

Ini tidak bersaing karena saya pikir saya tidak diperbolehkan menjawab pertanyaan saya sendiri.

Juga, saya belum memiliki kesempatan untuk menjalankan ini di komputer, tetapi sepertinya saya harus bekerja. Saya akan menjalankannya di komputer segera setelah saya punya kesempatan.

Daniel
sumber
4
Anda baik-baik saja untuk menjawab pertanyaan Anda sendiri. Beberapa orang bahkan memberikan jawaban sebelum mengajukan pertanyaan itu sendiri. Biasanya mereka masih dikalahkan oleh bahasa golf seperti Jelly, Pyth, Pyke, dan sejenisnya. ;)
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);}

Ini memanfaatkan fungsi yang sudah usang; ganti ereg_replace('[^0-9]'dengan preg_replace('%[^\d]%'untuk membuat kode sepenuhnya modern; menambahkan 1 byte.

Titus
sumber
0

CJam, 54 byte

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

Coba di sini!

kasus
sumber
Jawaban yang bagus, dan selamat datang di situs! Asal tahu saja, ada juru bahasa CJam online di sini. Anda bisa menautkan itu di pos Anda untuk memudahkan pembaca menjalankan / menguji jawaban Anda.
DJMcMayhem