Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. Converting numbers into English

Converting numbers into English

Scheduled Pinned Locked Moved The Lounge
csharpalgorithmshelpquestionannouncement
51 Posts 11 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N NormDroid

    How about to roman numerals ;)

    Software Kinetics - Dependable Software news

    M Offline
    M Offline
    Member_5893260
    wrote on last edited by
    #26

    Oh, yeah - that's fun - actually quite difficult!

    P 1 Reply Last reply
    0
    • M Mark_Wallace

      Oh oh, that's not how you do phone numbers.

      I wanna be a eunuchs developer! Pass me a bread knife!

      M Offline
      M Offline
      Member_5893260
      wrote on last edited by
      #27

      ROFL!

      1 Reply Last reply
      0
      • L Lost User

        You had to go no further than our very own CP[^] or I stole this from StuckOverflow...

        public static string NumberToWords(int number)
        {
        if (number == 0)
        return "zero";

        if (number < 0)
            return "minus " + NumberToWords(Math.Abs(number));
        
        string words = "";
        
        if ((number / 1000000) > 0)
        {
            words += NumberToWords(number / 1000000) + " million ";
            number %= 1000000;
        }
        
        if ((number / 1000) > 0)
        {
            words += NumberToWords(number / 1000) + " thousand ";
            number %= 1000;
        }
        
        if ((number / 100) > 0)
        {
            words += NumberToWords(number / 100) + " hundred ";
            number %= 100;
        }
        
        if (number > 0)
        {
            if (words != "")
                words += "and ";
        
            var unitsMap = new\[\] { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
            var tensMap = new\[\] { "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };
        
            if (number < 20)
                words += unitsMap\[number\];
            else
            {
                words += tensMap\[number / 10\];
                if ((number % 10) > 0)
                    words += "-" + unitsMap\[number % 10\];
            }
        }
        
        return words;
        

        }

        MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

        M Offline
        M Offline
        Member_5893260
        wrote on last edited by
        #28

        Yeah - I thought about doing it that way but it wasn't fun to write! I'm sure I overcomplicated it, but - whatever - I had fun!

        1 Reply Last reply
        0
        • M Marc A Brown

          1. Why not? 2. To learn the language. Beats the heck out of "Hello World". 3. For the same reason people draw doodles. 4. Why not? :)

          M Offline
          M Offline
          Member_5893260
          wrote on last edited by
          #29

          That's it - it's a doodle!

          1 Reply Last reply
          0
          • L Lost User

            mark merrens wrote:

            Curmudgeonprofessional

            ftfy

            MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

            R Offline
            R Offline
            R Giskard Reventlov
            wrote on last edited by
            #30

            _Maxxx_ wrote:

            Curmudgeonprofessional

            Pompous ass. That should do it.

            "If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair. Those who seek perfection will only find imperfection nils illegitimus carborundum me, me, me me, in pictures

            M L 2 Replies Last reply
            0
            • M Member_5893260

              Really? Convert's slow? Thanks!

              J Offline
              J Offline
              jschell
              wrote on last edited by
              #31

              Dan Sutton wrote:

              Really? Convert's slow? Thanks!

              Good luck ever finding a real application where that has even a measurable impact on performance though.

              1 Reply Last reply
              0
              • M Member_5893260

                A parser isn't really applicable here: you can't exactly parse a string of digits into English...

                P Offline
                P Offline
                PIEBALDconsult
                wrote on last edited by
                #32

                Convert.ToInt32(N % p); Use a cast. There is only one useful method in Convert -- ChangeType. For all other uses for Convert, there are better alternatives.

                M 1 Reply Last reply
                0
                • P PIEBALDconsult

                  Convert.ToInt32(N % p); Use a cast. There is only one useful method in Convert -- ChangeType. For all other uses for Convert, there are better alternatives.

                  M Offline
                  M Offline
                  Member_5893260
                  wrote on last edited by
                  #33

                  Noted - very good.

                  1 Reply Last reply
                  0
                  • R R Giskard Reventlov

                    _Maxxx_ wrote:

                    Curmudgeonprofessional

                    Pompous ass. That should do it.

                    "If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair. Those who seek perfection will only find imperfection nils illegitimus carborundum me, me, me me, in pictures

                    M Offline
                    M Offline
                    Member_5893260
                    wrote on last edited by
                    #34

                    Concur!

                    1 Reply Last reply
                    0
                    • L Lost User

                      You had to go no further than our very own CP[^] or I stole this from StuckOverflow...

                      public static string NumberToWords(int number)
                      {
                      if (number == 0)
                      return "zero";

                      if (number < 0)
                          return "minus " + NumberToWords(Math.Abs(number));
                      
                      string words = "";
                      
                      if ((number / 1000000) > 0)
                      {
                          words += NumberToWords(number / 1000000) + " million ";
                          number %= 1000000;
                      }
                      
                      if ((number / 1000) > 0)
                      {
                          words += NumberToWords(number / 1000) + " thousand ";
                          number %= 1000;
                      }
                      
                      if ((number / 100) > 0)
                      {
                          words += NumberToWords(number / 100) + " hundred ";
                          number %= 100;
                      }
                      
                      if (number > 0)
                      {
                          if (words != "")
                              words += "and ";
                      
                          var unitsMap = new\[\] { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
                          var tensMap = new\[\] { "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };
                      
                          if (number < 20)
                              words += unitsMap\[number\];
                          else
                          {
                              words += tensMap\[number / 10\];
                              if ((number % 10) > 0)
                                  words += "-" + unitsMap\[number % 10\];
                          }
                      }
                      
                      return words;
                      

                      }

                      MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

                      P Offline
                      P Offline
                      PIEBALDconsult
                      wrote on last edited by
                      #35

                      Not very flexible.

                      L 1 Reply Last reply
                      0
                      • N NormDroid

                        How about to roman numerals ;)

                        Software Kinetics - Dependable Software news

                        P Offline
                        P Offline
                        PIEBALDconsult
                        wrote on last edited by
                        #36

                        I added that to my version last night. And today I wondered about adding support for doing thousands as hundreds, e.g. "twenty-five hundred".

                        1 Reply Last reply
                        0
                        • M Mark_Wallace

                          Oh oh, that's not how you do phone numbers.

                          I wanna be a eunuchs developer! Pass me a bread knife!

                          P Offline
                          P Offline
                          PIEBALDconsult
                          wrote on last edited by
                          #37

                          Phone numbers aren't numbers.

                          1 Reply Last reply
                          0
                          • M Member_5893260

                            Oh, yeah - that's fun - actually quite difficult!

                            P Offline
                            P Offline
                            PIEBALDconsult
                            wrote on last edited by
                            #38

                            Only as difficult as you like.

                            1 Reply Last reply
                            0
                            • P PIEBALDconsult

                              Not very flexible.

                              L Offline
                              L Offline
                              Lost User
                              wrote on last edited by
                              #39

                              True -0 but the likelihood of the number system changing any time soon is low ;)

                              MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

                              P 1 Reply Last reply
                              0
                              • R R Giskard Reventlov

                                _Maxxx_ wrote:

                                Curmudgeonprofessional

                                Pompous ass. That should do it.

                                "If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair. Those who seek perfection will only find imperfection nils illegitimus carborundum me, me, me me, in pictures

                                L Offline
                                L Offline
                                Lost User
                                wrote on last edited by
                                #40

                                Well fuck you

                                MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

                                R 1 Reply Last reply
                                0
                                • M Marc A Brown

                                  1. Why not? 2. To learn the language. Beats the heck out of "Hello World". 3. For the same reason people draw doodles. 4. Why not? :)

                                  L Offline
                                  L Offline
                                  Lost User
                                  wrote on last edited by
                                  #41

                                  Marc A. Brown wrote:

                                  1. Why not?

                                  Well he said he did it at work, so I assumed it was something required for the business rather than being done as a leisure activity. So re-inventing the wheel is not generally a good thing for a business to do with so trivial a thing.

                                  Marc A. Brown wrote:

                                  To learn the language. Beats the heck out of "Hello World".

                                  Again - he was doing it at work & I assumed that he wasn't doing it for fun but for a business requirement.

                                  Marc A. Brown wrote:

                                  4. Why not? :)

                                  Because

                                  MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

                                  P 1 Reply Last reply
                                  0
                                  • L Lost User

                                    True -0 but the likelihood of the number system changing any time soon is low ;)

                                    MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

                                    P Offline
                                    P Offline
                                    PIEBALDconsult
                                    wrote on last edited by
                                    #42

                                    Think globally.

                                    1 Reply Last reply
                                    0
                                    • L Lost User

                                      Marc A. Brown wrote:

                                      1. Why not?

                                      Well he said he did it at work, so I assumed it was something required for the business rather than being done as a leisure activity. So re-inventing the wheel is not generally a good thing for a business to do with so trivial a thing.

                                      Marc A. Brown wrote:

                                      To learn the language. Beats the heck out of "Hello World".

                                      Again - he was doing it at work & I assumed that he wasn't doing it for fun but for a business requirement.

                                      Marc A. Brown wrote:

                                      4. Why not? :)

                                      Because

                                      MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

                                      P Offline
                                      P Offline
                                      PIEBALDconsult
                                      wrote on last edited by
                                      #43

                                      _Maxxx_ wrote:

                                      he said he did it at work, so I assumed it was something required for the business

                                      I did most of my Turing Machine experiments at a previous job. :~

                                      1 Reply Last reply
                                      0
                                      • L Lost User

                                        Well fuck you

                                        MVVM # - I did it My Way ___________________________________________ Man, you're a god. - walterhevedeich 26/05/2011 .\\axxx (That's an 'M')

                                        R Offline
                                        R Offline
                                        R Giskard Reventlov
                                        wrote on last edited by
                                        #44

                                        No sir, fuck you. I would suggest purchasing a sense of humor: you plainly lack one and are so far up your own ass I can't believe you can see well enough to have written these posts. Have a nice day, twat.

                                        "If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair. Those who seek perfection will only find imperfection nils illegitimus carborundum me, me, me me, in pictures

                                        L 1 Reply Last reply
                                        0
                                        • M Member_5893260

                                          So I've been enjoying myself at work today: I wrote something to take a number and convert it into English, e.g. "12324.56" becomes "twelve thousand, three hundred and twenty-four point five six". I know this is an old problem: I remember having done this something like 30 years ago, as part of a computer science class, but I actually needed it for something today: in doing it, I was amazed at how many ways there are to achieve it in C# (the last time I wrote it, it was in Algol-60!), and how many little optimizations I was able to add as I sat there looking at each iteration of the code. I ended up trying to keep the code as terse as I could but also as fast as I could, without having too many IFs and things all over the place. I ended up using a bunch of enums and letting the runtime make words out of them, rather than having strings for it: I'm not sure it makes a huge difference, but it just seemed more elegant, somehow. Of course, in a problem like this, there's always the part about trying to stop it saying things like, "two thousand, zero hundred and onety-zero", so part of the fun was trying not to write anything too specific to avoid things like that: in my mind, if I got the algorithm right, that stuff would just sort of work... It's nice having a bit of time on one's hands at work, for a change. Anyway, I had a lot of fun, so I thought I'd share: if anyone else has a better method (and I'm sure they do) then why not join in...? Meanwhile, here's my version:

                                          public static class Numeric
                                          {
                                          private enum Digit
                                          {
                                          zero = 0, one = 1, two = 2, three = 3, four = 4,
                                          five = 5, six = 6, seven = 7, eight = 8, nine = 9
                                          }

                                          private enum Teen
                                          {
                                          ten = 10, eleven = 11, twelve = 12, thirteen = 13, fourteen = 14,
                                          fifteen = 15, sixteen = 16, seventeen = 17, eighteen = 18, nineteen = 19
                                          }

                                          private enum Ten
                                          {
                                          twenty = 2, thirty = 3, forty = 4, fifty = 5,
                                          sixty = 6, seventy = 7, eighty = 8, ninety = 9
                                          }

                                          private enum PowerOfTen
                                          {
                                          hundred = 0, thousand = 1, million = 2, billion = 3,
                                          trillion = 4, quadrillion = 5, quintillion = 6
                                          }

                                          /// /// How many powers of ten there are; faster to work this out ahead of time,
                                          /// and I didn't want to hard-code it into the algorithm...
                                          ///
                                          private static int PowersOfTen = Enum.GetValues(typeof(PowerOfTen)).Length;

                                          /// /// Converts a number to English words
                                          ///
                                          /// The number

                                          P Offline
                                          P Offline
                                          PIEBALDconsult
                                          wrote on last edited by
                                          #45

                                          Thanks for a few days' exercise. I made one that can be used like: 2345L.ToString<ShortScale>() ==> Two Thousand Three Hundred Forty-Five Where ShortScale is:

                                          public enum ShortScale : long
                                          {
                                          Zero = 0 , One = 1 , Two = 2 , Three = 3 , Four = 4 , Five = 5 , Six = 6 , Seven = 7 , Eight = 8
                                          , Nine = 9 , Ten = 10 , Eleven = 11 , Twelve = 12 , Thirteen = 13 , Fourteen = 14 , Fifteen = 15
                                          , Sixteen = 16 , Seventeen = 17 , Eighteen = 18 , Nineteen = 19

                                          , \[PIEBALD.Types.NumNuts.HyphenatedAttribute\] Twenty   = 20  
                                          

                                          ...
                                          , [PIEBALD.Types.NumNuts.CountedAttribute] Hundred = 100
                                          ...
                                          }

                                          I also have an enum that will yield Twenty-Three Hundred Forty-Five, but it needs work. Here's another: 2345L.ToString<Roman>() ==> MMCCCXLV

                                          public enum Roman
                                          {
                                          Nulla = 0
                                          , [PIEBALD.Types.NumNuts.RepeatedAttribute] I = 1
                                          , [PIEBALD.Types.NumNuts.RepeatedAttribute] IV = 4
                                          , [PIEBALD.Types.NumNuts.RepeatedAttribute] V = 5
                                          , [PIEBALD.Types.NumNuts.RepeatedAttribute] IX = 9
                                          , [PIEBALD.Types.NumNuts.RepeatedAttribute] X = 10
                                          ...
                                          }

                                          But this technique tops out at Quintillion (short scale) or Trillion (long scale), so another technique would be necessary to work with greater numbers. It should be possible to define a class of BigInteger constants and use that instead. Added:

                                          public sealed class TestClass
                                          {
                                          public static readonly System.Numerics.BigInteger Zero = 0 ;
                                          public static readonly System.Numerics.BigInteger One = 1 ;
                                          ...
                                          [PIEBALD.Types.NumNuts.HyphenatedAttribute]
                                          public static readonly System.Numerics.BigInteger Twenty = 20 ;
                                          ...
                                          [PIEBALD.Types.NumNuts.CountedAttribute]
                                          public static readonly System.Numerics.BigInteger Hundred = 100 ;
                                          ...
                                          [PIEBALD.Types.NumNuts.CountedAttribute]
                                          public static readonly System.Numerics.BigInteger Decillion = Thousand * Nonillion ;
                                          ...
                                          }

                                          M 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups