Je ne paie qu'avec des dollars

14

Comme le titre - bien que discrètement - l'indique, je ne paie qu'avec des dollars.

Le défi

Écrivez une fonction / un programme qui prend une chaîne en entrée, qui est une valeur monétaire précédée d'un symbole. ex) £4.99. Ensuite, retournez le même montant converti en USD.

Contribution

Vous obtiendrez une chaîne en entrée. Il aura le symbole monétaire suivi d'un nombre avec deux décimales (ce qui pourrait être .00). Il y aura soit des décimales .et / ou des virgules ,séparant le nombre. Les symboles monétaires suivants viendront dans les entrées:

Euro: €
Livre sterling: £
Yuan Renminbi: ¥

En outre, il y aura une virgule ou un point décimal en fonction de la devise pour séparer les «dollars» des «cents»:

Euro: #. ###, ##
Livre sterling: #, ###. ##
Yuan Renminbi: #, ###. ##

Production

Vous convertirez l'entrée de la devise déterminée par le symbole en USD, arrondie à deux décimales. La sortie sera au format $#,###.##, et il y aura bien sûr plus de nombres à gauche de la sortie si besoin est ( EDIT: cela signifie qu'il y a un nombre arbitraire de virgules dans la sortie, tout comme dans l'entrée ). Les taux de change que nous utiliserons sont ci-dessous.

Vous pouvez supposer que l'entrée contient un symbole qui n'est que l'un des éléments ci-dessus ( € £ ¥ . ,) - qu'il est toujours valide.

Taux d'échange

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

Exemples

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

Respective output:
$1.51
$5.48
$417,318.42

Les derniers mots

  1. Si vous utilisez l'un des symboles ci-dessus (€, £, ¥), vous pouvez les compter comme 1 octet
  2. C'est le golf de code, donc le code le plus court en octets gagne!
Daniel
la source
1
Si vous voulez utiliser le vrai l10n, le renminbi doit avoir un délimiteur de virgule à la marque 10k, pas à la marque 1k. (par exemple, 10,0000.15)
Pas que Charles
24
C'est drôle que si vous avez posté cette question hier, le taux de change de la livre anglaise aurait été £1 : $1.51xD
Kevin Cruijssen
1
Ok @Adnan, je vais le faire. Terminé.
Daniel
2
Hmm, cette sortie est-elle correcte? 1.37 * 1.10 = 1,507 = 1,51(donc pas 1.52) et 4.00 * 1.37 = 5.48(pas 5.50) et 2782122.78 * 0.15 = 417318.417 = 417318.42(pas 420165.06) ...: S
Kevin Cruijssen
1
@KevinCruijssen, je viens de réaliser que lors de l'utilisation de Google pour convertir, le taux de change avait déjà changé. A corrigé.
Daniel

Réponses:

1

Pyth - 54 53 48 47 octets

J'ai oublié l'application conditionnelle W.

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

Suite de tests .

Maltysen
la source
Hmm .. est-ce moi ou est-ce une assez grosse réponse pour Pyth en termes d'octets? o.Ô C'est presque le 1/4 de ma réponse Java ! (Habituellement, c'est environ 1 / 50e .. xD)
Kevin Cruijssen
1
@KevinCruijssen oui, le formatage des chaînes et les données brutes sur les devises représentent près de la moitié de la taille.
Maltysen
5

Python 3.6 (pré-version), 87

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

Utilise des chaînes f pour évaluer le résultat et formater .

s.translate({46:'',44:''})supprime les points et virgules s, ce qui en fait un intlittéral valide , puis le int(...)convertit en intobjet réel .

vaultah
la source
4

Convexe, 56 55 54 octets

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

Eh bien, cela peut certainement être raccourci. Essayez-le en ligne!

Un octet enregistré grâce à Lynn!

Explication à venir lorsque je pourrai accéder à un ordinateur.

GamrCorps
la source
Et alors [1.1_.27+.15]?
Lynn
@Lynn c'est du génie! Merci!
GamrCorps
"Explication à venir lorsque je pourrai accéder à un ordinateur", ce qui implique que cette petite pépite d'une incroyable lisibilité a été écrite sur un appareil mobile . bravo, savant érudit. bien joué.
strugee
1
@strugee Oui, je suis sorti toute la journée mais j'ai créé un clavier CP-1252 pour mon iPhone à cet effet.
GamrCorps
Pourquoi la dernière marque de 55 octets est-elle supprimée? Aussi, typez définitivement - définitivement .
user48538
3

Python 3.5, 137 131 121 120 120 117 octets:

(Merci à Maltysen pour une astuce pour économiser 6 octets (137 -> 131)!)

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

Essayez-le en ligne! (Ideone)

R. Kap
la source
2
vous n'avez pas besoin de faire votre propre arrondi, le .format()faites pour vous si vous le faites${:,.2f}
Maltysen
@Maltysen Merci! Je ne savais pas que je pouvais faire ça! :)
R. Kap
46:0remplace les points par des caractères NUL.
vaultah
@vaultah Et alors? Cela fonctionne pour les entrées Euro.
R. Kap
@vaultah Eh bien, cela fonctionne parfaitement sur Ideone et mon ordinateur.
R. Kap
3

JavaScript (ES6), 107

Simple et direct , probablement plus jouable au golf

Remarque: testé dans FireFox. De nombreux navigateurs (notamment mobiles) prennent en chargetoLocaleString

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

TESTER

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
la source
Je n'ai pu tester cela que sur Firefox. Pouvez-vous me donner un lien vers Firefoex?
NoOneIsHere
@NoOneIsHere Google "Firefoex", il vous donnera le lien correct même s'il est mal orthographié
edc65
3

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

(201 - 2 octets en raison de la règle " Si vous utilisez l'un des symboles ci-dessus (€, £, ¥), vous pouvez les compter comme 1 octet ")
Merci à @Frozn d' avoir économisé beaucoup d'octets.

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

Code non testé et testé:

Essayez-le ici.

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

Production:

$1.51
$5.48
$417,318.42
Kevin Cruijssen
la source
2
char c=a.charAt(0)(dans l'ensemble, vous n'avez pas besoin cdu tout, voir ma réponse)
edc65
1
En tirant d *sur le ternaire, vous économisez une certaine duplication. On dirait ceci: d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn
@Frozn Merci. Aussi, malheureusement /100, *.01c'est la même quantité d'octets, et c=='€'?.011:c=='£'?.0137:.0015c'est exactement la même chose qu'avec le /100.
Kevin Cruijssen
1
Ouais c'est mauvais. Mais voici la bonne nouvelle: grâce aux valeurs unicode uniques des signes monétaires, vous pouvez les raccourcir car '£' < '¥' < '€'. Ainsi, vous pouvez écrire c<'¥'?1.37:c>'¥'?1.1:.15qui est plus court de 2 caractères.
Frozn
1
Je viens de voir que nous n'en avons plus besoin dcar il n'est utilisé qu'une seule fois.
Frozn
1

F #, 198 octets

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

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

J'essaie toujours de comprendre F #, donc traiter les milliers de séparateurs prend beaucoup d'octets.

Selon les règles du défi, les symboles Euro, Yen et Livre comptent pour un octet chacun, malgré la façon dont Unicode les stocke en interne.

interface scellée
la source
1

Python 3.5, 101 98

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

Les symboles Euro, Livre et Yen sont comptés comme 1 octet / caractère chacun, selon les règles du défi.

Au lieu de traduire ou d'interpréter des milliers et des séparateurs décimaux, ceux-ci sont simplement supprimés pour donner une chaîne de chiffres simples.

La chaîne de chiffres (après le symbole monétaire) est convertie en entier.

Le symbole monétaire est utilisé comme indice dans un dictionnaire de taux de conversion; la conversion est effectuée en multipliant par le taux de conversion et en divisant par 10000.

Le résultat est formaté avec un signe dollar de tête, deux décimales de précision et des virgules pour le regroupement.

PellMell
la source
Pourquoi ne supprimez-vous pas le 0 de 1,10 pour économiser 1 octet?
Daniel
Vous pouvez peut-être ignorer. dans les ratios et diviser par 1e4
agtoever
0

Python 3, 112 octets PAS EN CONCURRENCE

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

Ce n'est pas en compétition parce que je ne pense pas que je suis autorisé à répondre à ma propre question.

De plus, je n'ai pas encore eu la chance de faire fonctionner cela sur un ordinateur, mais il me semble que cela devrait fonctionner. Je l'exécuterai sur un ordinateur dès que j'en aurai l'occasion.

Daniel
la source
4
Vous êtes parfaitement d'accord pour répondre à votre propre question. Certaines personnes trouvent même une réponse avant de poser la question elle-même. Habituellement, ils sont toujours battus par des langues de golf comme Jelly, Pyth, Pyke et similaires. ;)
Kevin Cruijssen
0

PHP, 117 octets

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

Cela utilise une fonction obsolète; remplacer ereg_replace('[^0-9]'par preg_replace('%[^\d]%'pour rendre le code entièrement moderne; ajoute 1 octet.

Titus
la source
0

CJam, 54 octets

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

Essayez-le ici!

Cas
la source
Belle réponse, et bienvenue sur le site! Juste pour que vous le sachiez, il y a un interprète CJam en ligne ici .
James