Eu pago somente com dolares

14

Como o título - embora discretamente - sugere, só pago em dólares.

O desafio

Escreva uma função / programa que aceite uma string como entrada, que é um valor monetário precedido por um símbolo. ex) £4.99. Em seguida, retorne o mesmo valor convertido para USD.

Entrada

Você receberá uma string como entrada. Ele terá o símbolo da moeda seguido de um número com duas casas decimais (que pode ser .00). Haverá pontos decimais .e / ou vírgulas ,separando o número. Os seguintes símbolos monetários aparecerão nas entradas:

Euro: €
Libra esterlina: £
Yuan Renminbi: ¥

Além disso, haverá vírgula ou ponto decimal, dependendo da moeda para separar os 'dólares' dos 'centavos':

Euro: #. ###, ##
Libra esterlina: #, ###. ##
Yuan Renminbi: #, ###. ##

Resultado

Você converterá a entrada da moeda determinada pelo símbolo para USD, arredondando para duas casas decimais. A saída estará no formato $#,###.##e, é claro, haverá mais números à esquerda da saída, se necessário ( EDIT: isso significa que há um número arbitrário de vírgulas na saída, assim como na entrada ). A taxa de câmbio que usaremos está abaixo.

Você pode assumir que a entrada contém um símbolo que é apenas um dos itens acima ( € £ ¥ . ,) - que é sempre válido.

Taxas de câmbio

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

Exemplos

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

Respective output:
$1.51
$5.48
$417,318.42

Palavras finais

  1. Se você usar um dos símbolos acima (€, £, ¥), poderá contá-los como 1 byte
  2. Este é o código golf, pelo que o código mais curto em bytes vence!
Daniel
fonte
1
Se você deseja usar l10n verdadeiro, renminbi deve ter um delimitador de vírgula na marca 10k, não na marca 1k. (por exemplo, 10,0000.15)
Não que Charles
24
É engraçado que, se você postou esta pergunta ontem, a taxa de câmbio da libra Inglês teria sido £1 : $1.51xD
Kevin Cruijssen
1
Ok @Adnan, eu vou fazer isso. Feito.
Daniel
2
Hmm, essa saída está correta? 1.37 * 1.10 = 1,507 = 1,51(então não 1.52) e 4.00 * 1.37 = 5.48(não 5.50) e 2782122.78 * 0.15 = 417318.417 = 417318.42(não 420165.06) ...: S
Kevin Cruijssen
1
@KevinCruijssen, acabei de perceber que, ao usar o Google para converter, a taxa de câmbio já havia mudado. Corrigido.
Daniel

Respostas:

1

Pitão - 54 53 48 47 bytes

Esqueceu a aplicação condicional W.

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

Conjunto de Teste .

Maltysen
fonte
Hmm .. sou eu ou é uma resposta bastante grande para Pyth em termos de bytes? o.Ô É quase 1/4 da minha resposta Java ! (Geralmente é 1/50 ou mais .. xD)
Kevin Cruijssen
1
@KevinCruijssen sim, a formatação da string e os dados brutos da moeda representam quase metade do tamanho.
Maltysen
5

Python 3.6 (pré-lançamento), 87

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

Usa strings f para avaliar o resultado e formatá-lo .

s.translate({46:'',44:''})remove pontos e vírgulas s, tornando-o um intliteral válido e , em seguida,int(...) converte-o no intobjeto real .

vaultah
fonte
4

Convexo, 56 55 54 bytes

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

Bem, isso definitivamente pode ser reduzido. Experimente online!

Guardou um byte graças a Lynn!

Explicação para vir quando eu puder acessar um computador.

GamrCorps
fonte
Que tal [1.1_.27+.15]?
Lynn
@Lynn isso é genial! Obrigado!
GamrCorps
"Explicação que virá quando eu tiver acesso a um computador", implicando que aquela pequena pepita de incrível ilegibilidade foi escrita em um dispositivo móvel . bem feito, erudito erudito. bem feito.
strugee
1
@ strugee Sim, estive fora o dia todo, mas fiz um teclado CP-1252 para o meu iPhone para esse fim.
GamrCorps
Por que a última marca de 55 bytes está apagada? Além disso, erro de digitação definitivamente - definitivamente .
user48538
3

Python 3.5, 137 131 121 120 117 bytes:

(Obrigado a Maltysen por uma dica sobre como salvar 6 bytes (137 -> 131)!)

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

Experimente Online! (Ideona)

R. Kap
fonte
2
você não precisa fazer a sua própria arredondamento, .format()faz isso por você, se você fizer${:,.2f}
Maltysen
@Maltysen Thanks! Eu não sabia que poderia fazer isso! :)
R. Kap
46:0substitui pontos por caracteres NUL.
vaultah
@vaultah E daí? Funciona para entradas de euro.
R. Kap
@vaultah Bem, funciona perfeitamente bem no Ideone e no meu computador.
R. Kap
3

JavaScript (ES6), 107

Simples e direto , provavelmente mais jogável

Nota: testado no FireFox. Muitos navegadores (especialmente móveis) têm suporte de buggy paratoLocaleString

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

TESTE

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
fonte
Eu só pude testar isso no Firefox. Você pode me dar um link para Firefoex?
NoOneIsHere
@NoOneIsHere Google "Firefoex", ele vai te dar o link correto mesmo que seja mal escrito
edc65
3

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

(201 - 2 bytes devido à regra " Se você usar um dos símbolos acima (€, £, ¥), poderá contá-los como 1 byte ").
Agradecemos ao @Frozn por salvar muitos 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 & código de teste:

Experimente aqui.

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

Resultado:

$1.51
$5.48
$417,318.42
Kevin Cruijssen
fonte
2
char c=a.charAt(0)(todos em tudo o que você não precisa cde todo, ver minha resposta)
edc65
1
Ao retirar o d *ternário, você economiza alguma duplicação. Parece com isso: d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn
@Frozn Thanks. Também, infelizmente, /100e *.01é a mesma quantidade de bytes, e c=='€'?.011:c=='£'?.0137:.0015também os mesmos como com a /100.
Kevin Cruijssen
1
Sim, isso é ruim. Mas aqui estão as boas notícias: graças aos valores unicode exclusivos dos sinais de moeda, você pode reduzi-lo porque '£' < '¥' < '€'. Assim, você pode escrever c<'¥'?1.37:c>'¥'?1.1:.15quais são 2 caracteres mais curtos.
Frozn
1
Acabamos de ver que não precisamos dmais, pois é usado apenas uma vez.
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")

Sem golfe:

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

Ainda estou tentando descobrir o F #, portanto, lidar com os separadores de milhares está ocupando muitos bytes.

De acordo com as regras do desafio, os símbolos Euro, Iene e Libra contam como um byte cada, apesar de como o Unicode os armazena internamente.

interface selada
fonte
1

Python 3.5, 101 98

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

Os símbolos Euro, Libra e Iene são contados como 1 byte / caractere cada, de acordo com as regras do desafio.

Em vez de traduzir entre ou interpretar milhares e separadores decimais, eles são removidos para fornecer uma sequência de dígitos simples.

A sequência de dígitos (após o símbolo da moeda) é convertida em um número inteiro.

O símbolo da moeda é usado como um índice em um dicionário de taxas de conversão; a conversão é realizada multiplicando pela taxa de conversão e dividindo por 10000.

O resultado é formatado com um sinal de cifrão à esquerda, duas casas decimais de precisão e vírgulas para agrupamento.

PellMell
fonte
Por que você não exclui o 0 de 1,10 para salvar 1 byte?
Daniel
Talvez você possa pular a. nas proporções e divida por 1e4
agtoever 25/06
0

Python 3, 112 bytes NÃO CONCORDA

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

Isso não está competindo porque não acho que posso responder minha própria pergunta.

Além disso, ainda não tive a chance de executar isso em um computador, mas parece-me que deve funcionar. Vou executá-lo em um computador assim que tiver uma chance.

Daniel
fonte
4
Você está completamente bem em responder sua própria pergunta. Algumas pessoas chegam a responder antes de fazer a pergunta. Normalmente, eles ainda são derrotados por idiomas de golfe como Jelly, Pyth, Pyke e similares. ;)
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);}

Isso faz uso de uma função obsoleta; substitua ereg_replace('[^0-9]'por preg_replace('%[^\d]%'para tornar o código totalmente moderno; adiciona 1 byte.

Titus
fonte
0

CJam, 54 bytes

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

Experimente aqui!

caso
fonte
Boa resposta e bem-vindo ao site! Para que você saiba, existe um intérprete CJam on-line aqui. Você pode criar um link para isso em sua postagem para facilitar ao leitor executar / testar sua resposta.
DJMcMayhem