Я плачу лише доларами


14

Як підказує заголовок, хоча і дискретно, я плачу лише доларами.

Змагання

Напишіть функцію / програму, яка приймає рядок як вхід, який є грошовим значенням, якому передує символ. ex) £4.99. Потім поверніть ту саму суму, конвертовану в USD.

Вхідні дані

Ви отримаєте рядок як вхідний. У ній буде символ валюти, а потім число з двома знаками після коми (що може бути .00). Будуть або десяткові крапки .та / або коми, що ,розділяють число. Наступні символи валюти будуть надходити на входах:

Євро: €
фунт стерлінгів: £
Yuan Renminbi: ¥

Крім того, буде відома кома або десяткова крапка в залежності від валюти, щоб відокремити "долари" від "копійок":

Євро: #. ###, ##
Фунт стерлінгів: #, ###. ##
Yuan Renminbi: #, ###. ##

Вихідні дані

Ви конвертуєте вхідні дані з валюти, визначеної символом, в долари США, округлюючи до двох знаків після коми. Вихід буде у форматі $#,###.##, і, звичайно, буде більше цифр зліва від виводу, якщо це буде потрібно ( EDIT: це означає, що у виході є довільне число коми, як і у введенні ). Курс валюти, який ми будемо використовувати, наведено нижче.

Можна припустити, що вхід містить символ, який є лише одним із вищезазначених ( € £ ¥ . ,) - що він завжди дійсний.

Курси валют

€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, renminbi повинен мати роздільник комами на позначці 10k, а не на позначці 1k. (напр. 10,0000.15)
Не те, що Чарльз

24
Забавно, що якби ви опублікували це питання вчора, курс англійського фунта був би £1 : $1.51xD
Кевін Кройсейсен

1
Ок @ Аднан, я це зроблю. Зроблено.
Даніель

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
Кевін Крейсейсен

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"\Ø'$\

Ну, це, безумовно, можна скоротити. Спробуйте в Інтернеті!

Збережено байт завдяки Лінні!

Пояснення, коли я можу отримати доступ до комп'ютера.


Як щодо [1.1_.27+.15]?
Лінн

@Lynn thats genius! Спасибі!
GamrCorps

"Пояснення, коли я можу отримати доступ до комп'ютера", маючи на увазі, що той маленький самородок з дивовижною нечитабельністю був написаний на мобільному пристрої . молодець, вчений учений. молодець.
strugee

1
@strugee Так, я цілий день не був, але для цього я зробив клавіатуру CP-1252 для свого iPhone.
GamrCorps

Чому останні 55 байт закреслено? Крім того, вводити певно - точно .
user48538

3

Пітон 3,5, 137 131 121 120 117 байт:

(Дякую Малтісену за підказку щодо збереження 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 Дякую! Я не знав, що можу це зробити! :)
Р. Кап

46:0замінює точки з символами NUL.
vaultah

@vaultah Так що? Він працює для євро вкладів.
Р. Кап

@vaultah Ну, це прекрасно працює на Ideone та на моєму комп’ютері.
Р. Кап

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

1
Витягуючи d *з тернара, ви заощаджуєте деяке дублювання. Виглядає наступним чином : d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn

@Frozn Дякую Також, на жаль, /100і *.01така ж кількість байтів, а c=='€'?.011:c=='£'?.0137:.0015також точно така ж, як і для /100.
Kevin Cruijssen

1
Так, це погано. Але ось хороша новина: Завдяки унікальним знакам унікоду знаків валюти ви можете скоротити його '£' < '¥' < '€'. Таким чином, ви можете написати, 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

Пітон 3,5, 101 98

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

Символи "Євро", "Фунт" та "Єна" враховуються по 1 байту / символу кожен відповідно до правил виклику.

Замість того, щоб перекладати серед або інтерпретувати тисячі та десяткові роздільники, їх просто викреслюють, щоб дати простий рядковий рядок.

Розрядний рядок (після символу валюти) перетворюється на ціле число.

Символ валюти використовується як індекс у словнику конверсійних курсів; перетворення виконується шляхом множення на коефіцієнт перетворення та ділення на 10000.

Результат відформатований знаком провідного долара, двома десятковими знаками точності та комами для групування.


Чому ви не видалите 0 з 1.10, щоб зберегти 1 байт?
Даніель

Можливо, ви можете пропустити. у співвідношеннях і розділити на 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
Ви абсолютно добре відповідаєте на власне запитання. Деякі люди навіть придумують відповідь, перш ніж ставити запитання. Зазвичай їх все одно б'ють по гольф-мовах, таких як Jelly, Pyth, Pyke і подібні. ;)
Кевін Круїссен

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 тут Ви можете зв'язати до того , що у вашому пості , щоб зробити його простіше для читача , щоб бігти / перевірити свою відповідь.
Джеймс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.