Solo pago con dolares

14

Como el título, aunque discretamente, sugiere, solo pago con dólares.

El reto

Escriba una función / programa que tome una cadena como entrada, que es un valor monetario precedido por un símbolo. ex) £4.99. Luego, devuelva la misma cantidad convertida a USD.

Entrada

Obtendrá una cadena como entrada. Tendrá el símbolo de moneda seguido de un número con dos decimales (que podría ser .00). Habrá puntos decimales .y / o comas que ,separan el número. Los siguientes símbolos de moneda vendrán en las entradas:

Euro: €
Libra esterlina: £
Yuan Renminbi: ¥

Además, habrá una coma o un punto decimal dependiendo de la moneda para separar los 'dólares' de los 'centavos':

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

Salida

Convertirá la entrada de la moneda determinada por el símbolo a USD, redondeando a dos decimales. La salida estará en el formato $#,###.##y, por supuesto, habrá más números a la izquierda de la salida si es necesario ( EDITAR: esto significa que hay un número arbitrario de comas en la salida, al igual que en la entrada ). La tasa de cambio de moneda que usaremos se encuentra a continuación.

Puede suponer que la entrada contiene un símbolo que es solo uno de los anteriores ( € £ ¥ . ,), que siempre es válido.

Los tipos de cambio

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

Ejemplos

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

Respective output:
$1.51
$5.48
$417,318.42

Ultimas palabras

  1. Si usa uno de los símbolos anteriores (€, £, ¥), puede contarlos como 1 byte
  2. Este es el código de golf, por lo que gana el código más corto en bytes.
Daniel
fuente
1
Si desea usar l10n verdadero, el renminbi debe tener un delimitador de coma en la marca de 10k, no en la marca de 1k. (por ejemplo, 10,0000.15)
No es que Charles
24
Es curioso que si publicaste esta pregunta ayer, el tipo de cambio de la libra inglesa hubiera sido £1 : $1.51xD
Kevin Cruijssen
1
Ok @Adnan, lo haré. Hecho.
Daniel
2
Hmm, ¿es correcta esa salida? 1.37 * 1.10 = 1,507 = 1,51(así que no 1.52) y 4.00 * 1.37 = 5.48(no 5.50) y 2782122.78 * 0.15 = 417318.417 = 417318.42(no 420165.06) ...: S
Kevin Cruijssen
1
@KevinCruijssen, me acabo de dar cuenta de que, al usar Google para convertir, el tipo de cambio ya había cambiado. Arreglado.
Daniel

Respuestas:

1

Pyth - 54 53 48 47 bytes

Olvidé la aplicación condicional W.

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

Test Suite .

Maltysen
fuente
Hmm ... ¿soy yo o esta es una respuesta bastante grande para Pyth en términos de bytes? o.Ô ¡Es casi la cuarta parte de mi respuesta Java ! (Por lo general, es
1/50 más
1
@KevinCruijssen, sí, el formato de cadena y los datos de moneda sin procesar representan casi la mitad del tamaño.
Maltysen
5

Python 3.6 (prelanzamiento), 87

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

Utiliza cadenas f para evaluar el resultado y formatearlo .

s.translate({46:'',44:''})elimina puntos y comas s, lo que lo convierte en un intliteral válido y luego lo int(...)convierte en el intobjeto real .

vaultah
fuente
4

Convexo, 56 55 54 bytes

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

Bueno, esto definitivamente se puede acortar. Pruébalo en línea!

¡Ahorré un byte gracias a Lynn!

Explicación que vendrá cuando pueda acceder a una computadora.

GamrCorps
fuente
¿Qué tal [1.1_.27+.15]?
Lynn
@ Lynn eso es genial! ¡Gracias!
GamrCorps
"Explicación por venir cuando pueda obtener acceso a una computadora", lo que implica que esa pequeña pepita de increíble ilegibilidad se escribió en un dispositivo móvil . Bien hecho, erudito. bien hecho.
strugee
1
@strugee Sí, he estado fuera todo el día, pero he hecho un teclado CP-1252 para mi iPhone con este propósito.
GamrCorps
¿Por qué se tacha la última marca de 55 bytes? Además, el error tipográfico definitivamente - definitivamente .
user48538
3

Python 3.5, 137 131 121 120 117 bytes:

(¡Gracias a Maltysen por una pista sobre cómo guardar 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]])

¡Pruébelo en línea! (Ideona)

R. Kap
fuente
2
no necesita hacer su propio redondeo, lo .format()hace por usted si lo hace${:,.2f}
Maltysen
@ Maltysen Gracias! ¡No sabía que podía hacer eso! :)
R. Kap
46:0reemplaza puntos con caracteres NUL.
vaultah
@vaultah ¿Y qué? Funciona para entradas de euros.
R. Kap
@vaultah Bueno, funciona perfectamente bien en Ideone y mi computadora.
R. Kap
3

JavaScript (ES6), 107

Simple y directo , probablemente más golfable

Nota: probado en Firefox. Muchos navegadores (especialmente móviles) tienen soporte de errores detoLocaleString

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

PRUEBA

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
fuente
Solo pude probar esto en Firefox. ¿Me puede dar un enlace a Firefoex?
NoOneIsHere
@NoOneIsHere Google "Firefoex", le dará el enlace correcto incluso si está mal escrito
edc65
3

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

(201 - 2 bytes debido a la regla " Si usa uno de los símbolos anteriores (€, £, ¥), puede contarlos como 1 byte ")
Gracias a @Frozn por guardar muchos 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);}

Sin codificar y código de prueba:

Pruébalo aquí.

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

Salida:

$1.51
$5.48
$417,318.42
Kevin Cruijssen
fuente
2
char c=a.charAt(0)(en general, no necesita cnada, vea mi respuesta)
edc65
1
Al sacar el d *ternario, guarda algunas duplicaciones. Se parece a esto: d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn
@Frozn Gracias. Además, desafortunadamente /100y *.01es la misma cantidad de bytes, y c=='€'?.011:c=='£'?.0137:.0015también es exactamente lo mismo que con el /100.
Kevin Cruijssen
1
Si eso es malo. Pero aquí están las buenas noticias: gracias a los valores únicos de Unicode de los signos de moneda, puede acortarlo '£' < '¥' < '€'. Por lo tanto, puede escribir c<'¥'?1.37:c>'¥'?1.1:.15cuál es 2 caracteres más corto.
Frozn
1
Acabo de ver que ya no necesitamos dmás, ya que solo se usa una 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")

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

Todavía estoy tratando de descubrir F #, por lo que lidiar con los separadores de miles ocupa muchos bytes.

De acuerdo con las reglas de desafío, los símbolos Euro, Yen y Libra cuentan como un byte cada uno, a pesar de cómo Unicode los almacena internamente.

interfaz sellada
fuente
1

Python 3.5, 101 98

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

Los símbolos Euro, Libra y Yen se cuentan como 1 byte / carácter cada uno, según las reglas del desafío.

En lugar de traducir o interpretar miles y separadores decimales, estos simplemente se eliminan para dar una cadena de dígitos sin formato.

La cadena de dígitos (después del símbolo de moneda) se convierte en un entero.

El símbolo de moneda se usa como índice en un diccionario de tasas de conversión; la conversión se realiza multiplicando por la tasa de conversión y dividiendo por 10000.

El resultado está formateado con un signo de dólar inicial, dos decimales de precisión y comas para agrupar.

Caótico
fuente
¿Por qué no elimina el 0 de 1.10 para guardar 1 byte?
Daniel
Tal vez puedas saltarte el. en las proporciones y dividir por 1e4
hasta el
0

Python 3, 112 bytes NO COMPETIR

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

Esto no está compitiendo porque no creo que se me permita responder a mi propia pregunta.

Además, todavía no he tenido la oportunidad de ejecutar esto en una computadora, pero me parece que debería funcionar. Lo ejecutaré en una computadora tan pronto como tenga la oportunidad.

Daniel
fuente
44
Estás completamente bien para responder tu propia pregunta. Algunas personas incluso llegan a una respuesta antes de hacer la pregunta en sí. Sin embargo, por lo general, todavía son golpeados por idiomas de golf como Jelly, Pyth, Pyke y 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);}

Esto hace uso de una función obsoleta; reemplace ereg_replace('[^0-9]'con preg_replace('%[^\d]%'para hacer que el código sea completamente moderno; agrega 1 byte.

Titus
fuente
0

CJam, 54 bytes

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

Pruébalo aquí!

caso
fuente
Buena respuesta, y bienvenido al sitio! Para que lo sepas, hay un intérprete de CJam en línea aquí. Puedes vincularlo en tu publicación para que sea más fácil para el lector ejecutar / probar tu respuesta.
DJMcMayhem