public void CurrencyFormatting_ThrowException_WhenEmptyKey()
 {
     try
     {
         Money dough = new Money(8124.348m, "");
     }
     catch (Exception ex)
     {
         Assert.AreEqual("CurrencyCode not found\r\nParameter name: CurrencyCode", ex.Message);
     }
 }
        public void CurrencyFormatting_MixAndMatchDecimalAndMoney_NoExceptions()
        {
            Money dough = new Money(8124.348m, "978");
            decimal cash = 3124.728m;

            string result;

            //Simple EURO currency parameters, with basic U.S. formatting
            result = cash.ToString("C", new MoneyFormatInfo("978"));
            Assert.AreEqual(result, "€3,124.73");

            //ILLEGAL.  The exception will let you know.  Only "Money" type can take 'M' format string.
            //result = cash.ToString("M", new MoneyFormatInfo("978"));  //EXCEPTION WILL BE THROWN!
            //Assert.AreEqual(result, "EUR 3,124.73");

            //Construct money formatter to default to 3 digit code.
            //This is the correct way to make a decimal type format with a 3-digit currency code.
            result = cash.ToString("C", new MoneyFormatInfo("978", true));
            Assert.AreEqual(result, "EUR 3,124.73");

            //Ambient culture also affects the outcome.
            var temp = Thread.CurrentThread.CurrentCulture;
            //Swiss francs...
            var Switzerland = new CultureInfo("fr-CH");
            Thread.CurrentThread.CurrentCulture = Switzerland;

            result = cash.ToString("C");
            Assert.AreEqual(result, "fr. 3'124.73");
            result = dough.ToString("M");
            Assert.AreEqual(result, "EUR 8'124.35");
            result = String.Format("the cash: {0:C} and the money: {1:M}", cash, dough);
            Assert.AreEqual(result, "the cash: fr. 3'124.73 and the money: EUR 8'124.35");
            Thread.CurrentThread.CurrentCulture = temp;

            result = String.Format(new MoneyFormatInfo("978"), "the cash: {0:C} and the money: {1:M}", cash, dough);
            Assert.AreEqual(result, "the cash: €3,124.73 and the money: EUR 8,124.35");

            result = String.Format(new MoneyFormatInfo("978", true), "the cash: {0:C} and the money: {1:C}", cash, dough);
            Assert.AreEqual(result, "the cash: EUR 3,124.73 and the money: €8,124.35");

            //JAPANESE and EURO currencies intermingled, both with basic U.S. formatting.
            result = String.Format(new MoneyFormatInfo("392"), "the cash: {0:C} and the money: {1:M}", cash, dough);
            Assert.AreEqual(result, "the cash: ¥3,125 and the money: EUR 8,124.35");

            result = String.Format(new MoneyFormatInfo("392", true), "the cash: {0:C} and the money: {1:C}", cash, dough);
            Assert.AreEqual(result, "the cash: JPY 3,125 and the money: €8,124.35");

            //EURO currency parameters, with basic French formatting
            var french = new CultureInfo("fr-FR");
            result = String.Format(french, "the money: {0:M}", dough);
            Assert.AreEqual(result, "the money: 8 124,35 EUR");

            //JAPANESE YEN, with basic French formatting.
            var frenchmen = new MoneyFormatInfo("392", new CultureInfo("fr-FR"));
            result = String.Format(frenchmen, "the cash: {0:C}", cash);
            Assert.AreEqual(result, "the cash: 3 125 ¥");

            //No currency formatting
            result = String.Format("numeric cash: {0} and numeric Money: {1}", cash, dough);
            Assert.AreEqual(result, "numeric cash: 3124.728 and numeric Money: 8124.348");

            result = String.Format(new MoneyFormatInfo("978"), "numeric cash: {0} and numeric Money: {1}", cash, dough);
            Assert.AreEqual(result, "numeric cash: 3124.728 and numeric Money: 8124.348");
        }