我只用美元付款


14

作为标题-尽管是离散的-暗示,我只用美元支付。

挑战

编写一个将字符串作为输入的函数/程序,该字符串是货币值,后跟一个符号。ex) £4.99。然后,将相同的金额返回转换为美元。

输入值

您将获得一个字符串作为输入。它将带有货币符号,后跟一个带两位小数的数字(可能是.00)。用小数点.和/或逗号,分隔数字。以下货币符号将出现在输入中:

欧元:€
英镑:£
人民币:¥

另外,根据货币的不同,会用逗号或小数点将“美元”与“美分”分开:

欧元:#。###,##
英镑:#,###。##
人民币:#,###。##

输出量

您将输入内容从符号确定的货币转换为USD,四舍五入到小数点后两位。输出将采用format格式$#,###.##,如果需要的话,输出的左边当然会有更多数字(编辑:这意味着输出中有任意数量的逗号,就像输入中一样)。我们将使用的货币汇率如下。

您可以假定输入中包含的符号仅是上述(€ £ ¥ . ,)之一-始终有效。

汇率

€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,则人民币应在10k标记处而不是1k标记处有逗号分隔符。(例如10,0000.15
不是说查理(Charles

24
有趣的是,如果您昨天发布了这个问题,英镑的汇率将是£1 : $1.51xD
Kevin Cruijssen

1
好的,@ Adnan,我会做到的。做完了
丹尼尔(Daniel)

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
Kevin Cruijssen

1
@KevinCruijssen,我刚刚意识到,使用Google进行转换时,汇率已经发生了变化。固定它。
丹尼尔

Answers:


1

Pyth- 54 53 48 47字节

忘记了有条件的申请W

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

测试套件


嗯..是我还是这对于Pyth来说是一个相当大的字节数答案?o.Ô这几乎是我的Java答案的 1/4 !(通常是
1/50左右。.xD

1
@KevinCruijssen是的,字符串格式和原始货币数据几乎占一半大小。
Maltysen

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_.27+.15]
林恩

@林恩多数民众赞成在天才!谢谢!
GamrCorps

“当我可以使用计算机时,将要进行解释。”这意味着在移动设备上写了一点点令人敬畏的不可读取性。做得好,博学的学者。做得好。
6

1
@strugee是的,我整天都在外面,但为此我为我的iPhone制作了CP-1252键盘。
GamrCorps

为什么最后55个字节的标记被删除?此外,在错字definetely - 肯定
user48538

3

蟒3.5,137个 131 121 120 117字节:

(感谢Maltysen提供有关节省6个字节的提示(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 '16

@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

Java 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 '16

1
通过d *退出三元组,可以节省一些重复。看起来是这样的:d*(c=='€'?1.1:c=='£'?1.37:.15)/100
Frozn

@Frozn谢谢。另外,很遗憾,/100*.01的字节数相同,并且c=='€'?.011:c=='£'?.0137:.0015与完全相同/100
凯文·克鲁伊森

1
是的,这很糟糕。但这是个好消息:由于货币符号的唯一unicode值,您可以缩短它的时间,因为'£' < '¥' < '€'。因此,您可以写c<'¥'?1.37:c>'¥'?1.1:.15短2个字符的文字。
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

Python 3.5、101 98

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

根据质询规则,欧元,英镑和日元符号分别计为1个字节/字符。

而不是在千位和十进制分隔符之间进行翻译或解释,它们只是被剥离以给出纯数字字符串。

数字字符串(在货币符号之后)将转换为整数。

货币符号用作转换率字典的索引;通过乘以转换率并除以10000来执行转换。

结果的格式为前导美元符号,两位小数精度和用于分组的逗号。


为什么不从1.10删除0以节省1个字节?
丹尼尔(Daniel)

也许您可以跳过。在比率中除以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
您完全可以回答自己的问题。有些人甚至在提出问题之前就想出了答案。通常,他们仍然会受到果冻,佩斯,派克等高尔夫语言的殴打。;)
Kevin Cruijssen

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解释器您可以链接到您的帖子中,以使读者更轻松地运行/测试您的答案。
詹姆斯(James)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.