using System.Globalization;
public static void Main()
Console.WriteLine("input | expect | actual");
public static void Test(long val, string currency = "GBP") {
Console.WriteLine(val.ToString("#.00")
+ " | " + val.ToMoneyUnit_ProposedFix(currency).ToString("0.00")
+ " | " + val.ToMoneyUnit(currency).ToString("0.00")
public static class CurrencyExtensions
public static int ToSmallestUnit(this decimal amount, string currencyCode)
var culture = GetCulture(currencyCode);
int precision = culture.NumberFormat.CurrencyDecimalDigits;
return (int)(amount * (decimal)Math.Pow(10, precision));
public static decimal ToMoneyUnit(this long amount, string currencyCode)
var culture = GetCulture(currencyCode);
int precision = culture.NumberFormat.CurrencyDecimalDigits;
int devisor = precision * 10;
return ((decimal)amount) / devisor;
public static decimal ToMoneyUnit_ProposedFix(this long amount, string currencyCode)
var culture = GetCulture(currencyCode);
int precision = culture.NumberFormat.CurrencyDecimalDigits;
int devisor = (int)Math.Pow(10,precision);
return ((decimal)amount) / devisor;
public static CultureInfo GetCulture(string currencyCode)
string cultureCode = null;
switch (currencyCode.ToUpper())
CultureInfo match = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.FirstOrDefault(x => new RegionInfo(x.LCID).ISOCurrencySymbol == currencyCode);
throw new NotImplementedException("The currency code '"+currencyCode+"' is not currently supported");
return new CultureInfo(cultureCode);