私はドルでのみ支払います


14

タイトルとして-個別にではあるが-ヒントとして、私はドルでのみ支払う。

チャレンジ

入力として文字列をとる関数/プログラムを作成します。これは、記号が前に付いた金額です。ex) £4.99。次に、同じ金額を米ドルに換算して返します。

入力

入力として文字列を取得します。通貨記号の後に小数点以下2桁の数字が続きます(これは可能性があります.00)。数字を区切る小数点.および/またはコンマがあります,。次の通貨記号が入力に含まれます。

ユーロ:€英
ポンド:£
人民元:¥

また、通貨に応じてコンマまたは小数点があり、「ドル」を「セント」から分離します。

ユーロ:#。###、##英
ポンド:#、###。##
元人民元:#、###。##

出力

入力を、シンボルで決定された通貨からUSDに変換し、小数点以下2桁に丸めます。出力はの形式$#,###.##になり、必要に応じて出力の左側にさらに数字があります(編集:これは、入力と同様に、出力に任意の数のコンマがあることを意味します)。使用する為替レートは以下のとおりです。

入力には、上記(€ £ ¥ . ,)の1つだけであるシンボルが含まれていると想定できます。これは常に有効です。

為替相場

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

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

Respective output:
$1.51
$5.48
$417,318.42

最後の言葉

  1. 上記の記号(€、£、¥)のいずれかを使用する場合、1バイトとしてカウントできます。
  2. これはコードゴルフなので、バイト単位の最短コードが勝ちです!

1
真のl10nを使用する場合、人民元では、1kマークではなく、10kマークにカンマ区切り文字が必要です。(例、10,0000.15
チャールズではない

24
それはあなたが昨日この質問を投稿した場合、英語ポンドの為替レートがあったであろうことをおかしい£1 : $1.51のxD
ケビンCruijssen

1
OK @Adnan、それをやります。できた
ダニエル

2
うーん、その出力は正しいですか?1.37 * 1.10 = 1,507 = 1,51(そうではない1.52)と4.00 * 1.37 = 5.48(ない5.50)と2782122.78 * 0.15 = 417318.417 = 417318.42(ない420165.06)...:S
ケビンCruijssen

1
@ KevinCruijssen、Googleを使用して変換すると、為替レートが既に変更されていることに気付きました。それを修正しました。
ダニエル

回答:


1

Pyth- 54 53 48 47バイト

条件付きアプリケーションを忘れましたW

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

テストスイート


うーん..それは私ですか、これはバイトの面でPythにとってかなり大きな答えですか?o.Ôそれの私のほぼ1/4 のJavaの答え!(通常は
1/50

1
@KevinCruijssenそう、文字列のフォーマットと生の通貨データはサイズのほぼ半分を占めています。
マルティセン

5

Python 3.6(プレリリース)、87

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

f文字列を使用して結果を評価し、フォーマットします。

s.translate({46:'',44:''})からドットとコンマを削除sして有効なintリテラルint(...)にし、実際のintオブジェクトに変換します。


4

凸、56 55 54バイト

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

まあ、これは間違いなく短縮できます。オンラインでお試しください!

Lynnのおかげで1バイト節約できました!

コンピューターにアクセスできるようになったときに来る説明。


どう[1.1_.27+.15]
リン

@Lynnそれは天才だ!ありがとう!
GamrCorps

「コンピューターにアクセスできるようになったときに来る説明」は、驚くほど読めないという小さなナゲットがモバイルデバイスに書き込まれたことを意味します。よくやった、学んだ学者。よくやった。
-strugee

1
@strugeeええ、私は一日中出かけましたが、この目的のために私のiPhone用のCP-1252キーボードを作りました。
GamrCorps

最後の55バイトのマークが削除されるのはなぜですか?また、のタイプミスdefinetely - 確かに
user48538

3

Python 3.5、137 131 121 120 117バイト:

(6バイトの節約に関するヒントをMaltysenに感謝します(137 -> 131)!)

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

オンラインでお試しください!(イデオン)


2
あなたはあなた自身の丸めを行う必要はありません、あなたがするならあなたの.format()ためにそれを行います${:,.2f}
-Maltysen

@Maltysenありがとう!私はそれができるとは知りませんでした!:)
R. Kap

46:0ドットをNUL文字に置き換えます。
vaultah

@vaultahそれで何?ユーロ入力に対して機能します。
R. Kap

@vaultahまあ、それはIdeoneと私のコンピューターで完璧に動作します。
R. Kap

3

JavaScript(ES6)、107

シンプルで簡単、おそらくよりゴルフに適しています

注:FireFoxでテスト済み。多くのブラウザ(特にモバイル)には、バグのあるサポートがありますtoLocaleString

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

テスト

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>


これはFirefoxでしかテストできませんでした。Firefoexへのリンクを教えていただけますか?
-NoOneIsHere

@NoOneIsHere Googleの「Firefoex」、それがスペルミスいても、あなたに正しいリンクを与えるだろう
edc65

3

ジャワ7、240 227 215 211 207の 202 199 196バイト

(201 -ためのルールの2バイト「あなたは上記の記号(€、£、¥)のいずれかを使用する場合は、1つのバイトとしてそれらをカウントしてもよい」)
のおかげ@Froznバイトの多くを保存するために。

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

未ゴルフ&テストコード:

ここで試してみてください。

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

出力:

$1.51
$5.48
$417,318.42

2
char c=a.charAt(0)(すべて必要ないcすべてで、私の答えを参照)
edc65

1
d *三元から引き出すことにより、重複を節約できます。次のようになりますd*(c=='€'?1.1:c=='£'?1.37:.15)/100
Frozn

@Froznありがとう。また、残念ながら/100、これ*.01は同じバイト数であり、の場合とc=='€'?.011:c=='£'?.0137:.0015まったく同じ/100です。
ケビンCruijssen 16年

1
ええ、それは悪いです。しかし、ここに朗報があります'£' < '¥' < '€'。通貨記号の一意のユニコード値のおかげで、を短縮できます。したがって、c<'¥'?1.37:c>'¥'?1.1:.152文字短い文字を書くことができます。
Frozn

1
d一度だけ使用されるので、もう必要ありません。
Frozn

1

F#、198バイト

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

非ゴルフ:

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

私はまだF#を把握しようとしているので、数千個の区切り文字を扱うには多くのバイトが必要です。

チャレンジルールに従って、ユーロ、円、およびポンド記号は、Unicodeが内部でどのように保存するかにかかわらず、それぞれ1バイトとしてカウントされます。


1

Pythonの3.5、101 98

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

ユーロ、ポンド、および円記号は、チャレンジルールごとに1バイト/文字としてカウントされます。

桁区切り記号や小数点記号を変換したり解釈したりする代わりに、これらを単純に削除して、単純な数字文字列にします。

数字文字列(通貨記号の後)は整数に変換されます。

通貨記号は、換算レートの辞書のインデックスとして使用されます。変換は、変換率を掛けて10000で割ることによって実行されます。

結果は、先頭にドル記号、小数点以下2桁の精度、およびグループ化用のコンマでフォーマットされます。


1バイトを節約するために1.10から0を削除してみませんか?
ダニエル

たぶん、あなたはスキップすることができます。比率で、1e4で割る
合計

0

Python 3、112バイトが競合していません

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

私は自分の質問に答えることが許されているとは思わないので、これは競合していません。

また、私はまだコンピューターでこれを実行する機会がありませんでしたが、うまくいくように思えます。機会があればすぐにコンピューターで実行します。


4
自分の質問に答えても大丈夫です。質問自体を作成する前に答えを思い付く人もいます。通常、彼らはまだゼリー、パイス、パイクなどのゴルフ言語にbeatられています。;)
ケビンクルーッセン

0

PHP、117バイト

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

これは、廃止された関数を使用します。を置き換えereg_replace('[^0-9]'preg_replace('%[^\d]%'、コードを完全にモダンにします。1バイトを追加します。


0

CJam、54バイト

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

ここで試してみてください!


いい答えです。サイトへようこそ!ご存知のように、ここにはオンラインのCJamインタープリターがあります。投稿にリンクして、読者が答えを実行/テストしやすくすることができます。
DJMcMayhem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.