Quick way to convert int to array of numbers

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • John B

    Quick way to convert int to array of numbers

    Hi all,
    Say I have the int 123456789
    What would be the quickest/best way to convert it to
    int[]{1,2,3,4,5,6,7, 8,9}

    What I came up with was to determine the largest factor of 10 (100M)
    divide by that, truncate decimals and that'd be the 1st number, subtract
    that number multiplied by the current factor, next smallest factor etc..

    But it seems very roundabout, surely there'd be a better way :)

    TIA

    JB
  • Paul E Collins

    #2
    Re: Quick way to convert int to array of numbers

    "John B" <jbngspam@yahoo .comwrote:
    Say I have the int 123456789
    What would be the quickest/best way to convert it to
    int[]{1,2,3,4,5,6,7, 8,9}
    I think this is the most readable way:

    int[] x = new int[s.Length];
    for (int i = 0; i < s.Length; i++)
    {
    x[i] = Convert.ToInt32 (s[i]);
    }

    Unless this is really a performance bottleneck, there's no need to do
    anything cleverer.

    Eq.


    Comment

    • John B

      #3
      Re: Quick way to convert int to array of numbers

      Paul E Collins wrote:
      "John B" <jbngspam@yahoo .comwrote:
      >
      >Say I have the int 123456789
      >What would be the quickest/best way to convert it to
      >int[]{1,2,3,4,5,6,7, 8,9}
      >
      I think this is the most readable way:
      >
      int[] x = new int[s.Length];
      for (int i = 0; i < s.Length; i++)
      {
      x[i] = Convert.ToInt32 (s[i]);
      }
      >
      Unless this is really a performance bottleneck, there's no need to do
      anything cleverer.

      Yep, except its an actual long so I just convert with ToString to begin
      with.
      Its not at all a bottleneck but its very strange as I have had one
      instance where I got an "Input string was not in a correct format" on
      int.Parse

      The actual code is

      //value is a long
      string sVal = value.ToString( );
      for (int i = sVal.Length - 1; i >= 0; i--)
      {
      int iVal = int.Parse(sVal[i].ToString()); //Here is where the
      exception was raised.
      //...Do some validation
      }

      So I thought it'd just be easier to not convert them to a string and
      just treat them as int all the time.
      Of course this happened at a client site and I cannot reproduce it here :)

      Cheers

      JB

      Comment

      • =?ISO-8859-1?Q?Arne_Vajh=F8j?=

        #4
        Re: Quick way to convert int to array of numbers

        John B wrote:
        Say I have the int 123456789
        What would be the quickest/best way to convert it to
        int[]{1,2,3,4,5,6,7, 8,9}
        >
        What I came up with was to determine the largest factor of 10 (100M)
        divide by that, truncate decimals and that'd be the 1st number, subtract
        that number multiplied by the current factor, next smallest factor etc..
        >
        But it seems very roundabout, surely there'd be a better way :)
        I would say that it is easier/more readable to do:

        for(int i = 0; i < n; i++)
        {
        digs[n-i-1] = tmp % 10;
        tmp /= 10;
        }

        Arne


        Comment

        • Paul E Collins

          #5
          Re: Quick way to convert int to array of numbers

          "John B" <jbngspam@yahoo .comwrote:
          Yep, except its an actual long so I just convert with ToString to
          begin with.
          Its not at all a bottleneck but its very strange as I have had one
          instance where I got an "Input string was not in a correct format" on
          int.Parse
          You probably had "NaN" (zero divided by zero) or "Infinity" (anything
          else divided by zero). You won't be able to convert those strings to an
          integer.

          Eq.


          Comment

          • Peter Duniho

            #6
            Re: Quick way to convert int to array of numbers

            On Wed, 30 Apr 2008 19:31:26 -0700, Paul E Collins
            <find_my_real_a ddress@CL4.orgw rote:
            "John B" <jbngspam@yahoo .comwrote:
            >
            >Yep, except its an actual long so I just convert with ToString to
            >begin with.
            >Its not at all a bottleneck but its very strange as I have had one
            >instance where I got an "Input string was not in a correct format" on
            >int.Parse
            >
            You probably had "NaN" (zero divided by zero) or "Infinity" (anything
            else divided by zero). You won't be able to convert those strings to an
            integer.
            Those should only apply to floating point values. Assuming he started
            with an int or a long, that shouldn't have happened.

            Taking as granted that it did happen, I guess that suggests that the
            actual code was wrong. For sure, in theory code that starts with an int,
            converts to a string, and parses each character individually to convert
            back to an array of ints, should never fail.

            Of course, without seeing his actual code that failed, it's not possible
            to say what was actually wrong with it. Assuming the code he posted is in
            fact the actual code, or at least reasonably close to it, I think it's
            more likely that he had a negative number and the conversion failed on the
            minus sign. That'd be easy enough to deal with, but of course it begs the
            question as to what the actual result in his code should be.

            Pete

            Comment

            • John B

              #7
              Re: Quick way to convert int to array of numbers

              Peter Duniho wrote:
              On Wed, 30 Apr 2008 19:31:26 -0700, Paul E Collins
              <find_my_real_a ddress@CL4.orgw rote:
              >
              >"John B" <jbngspam@yahoo .comwrote:
              >>
              >>Yep, except its an actual long so I just convert with ToString to
              >>begin with.
              >>Its not at all a bottleneck but its very strange as I have had one
              >>instance where I got an "Input string was not in a correct format" on
              >>int.Parse
              >>
              >You probably had "NaN" (zero divided by zero) or "Infinity" (anything
              >else divided by zero). You won't be able to convert those strings to an
              >integer.
              >
              Those should only apply to floating point values. Assuming he started
              with an int or a long, that shouldn't have happened.
              >
              Taking as granted that it did happen, I guess that suggests that the
              actual code was wrong. For sure, in theory code that starts with an
              int, converts to a string, and parses each character individually to
              convert back to an array of ints, should never fail.
              >
              Of course, without seeing his actual code that failed, it's not possible
              to say what was actually wrong with it. Assuming the code he posted is
              in fact the actual code, or at least reasonably close to it, I think
              *****
              it's more likely that he had a negative number and the conversion failed
              on the minus sign. That'd be easy enough to deal with, but of course it
              ******
              <....>
              Thanks Peter, that must've been it.
              I have now added a check to ensure that negative numbers are flagged as
              invalid to prevent this from happening again.

              The actual code is just for validating the IMEI of a phone.

              Thanks,

              JB

              Comment

              • Ben Voigt [C++ MVP]

                #8
                Re: Quick way to convert int to array of numbers

                John B wrote:
                Peter Duniho wrote:
                >On Wed, 30 Apr 2008 19:31:26 -0700, Paul E Collins
                ><find_my_real_ address@CL4.org wrote:
                >>
                >>"John B" <jbngspam@yahoo .comwrote:
                >>>
                >>>Yep, except its an actual long so I just convert with ToString to
                >>>begin with.
                >>>Its not at all a bottleneck but its very strange as I have had one
                >>>instance where I got an "Input string was not in a correct format"
                >>>on int.Parse
                >>>
                >>You probably had "NaN" (zero divided by zero) or "Infinity"
                >>(anything else divided by zero). You won't be able to convert those
                >>strings to an integer.
                >>
                >Those should only apply to floating point values. Assuming he
                >started with an int or a long, that shouldn't have happened.
                >>
                >Taking as granted that it did happen, I guess that suggests that the
                >actual code was wrong. For sure, in theory code that starts with an
                >int, converts to a string, and parses each character individually to
                >convert back to an array of ints, should never fail.
                >>
                >Of course, without seeing his actual code that failed, it's not
                >possible to say what was actually wrong with it. Assuming the code
                >he posted is in fact the actual code, or at least reasonably close
                >to it, I think ***** it's more likely that he had a negative number
                >and the conversion failed on the minus sign. That'd be easy enough
                >to deal with, but of course it
                ******
                <....>
                Thanks Peter, that must've been it.
                I have now added a check to ensure that negative numbers are flagged
                as invalid to prevent this from happening again.
                >
                The actual code is just for validating the IMEI of a phone.
                That's probably long enough to overflow int.
                >
                Thanks,
                >
                JB

                Comment

                • Ben Voigt [C++ MVP]

                  #9
                  Re: Quick way to convert int to array of numbers

                  John B wrote:
                  Paul E Collins wrote:
                  >"John B" <jbngspam@yahoo .comwrote:
                  >>
                  >>Say I have the int 123456789
                  >>What would be the quickest/best way to convert it to
                  >>int[]{1,2,3,4,5,6,7, 8,9}
                  >>
                  >I think this is the most readable way:
                  >>
                  >int[] x = new int[s.Length];
                  >for (int i = 0; i < s.Length; i++)
                  >{
                  > x[i] = Convert.ToInt32 (s[i]);
                  >}
                  >>
                  >Unless this is really a performance bottleneck, there's no need to do
                  >anything cleverer.
                  >
                  >
                  Yep, except its an actual long so I just convert with ToString to
                  begin with.
                  Its not at all a bottleneck but its very strange as I have had one
                  instance where I got an "Input string was not in a correct format" on
                  int.Parse
                  Skip the Parse step, it's actually easier to convert the raw characters than
                  the integer.

                  int[] x = new int[s.Length];
                  int i = 0;
                  foreach (char c in s)
                  x[i++] = c - '0';


                  Comment

                  • Peter Duniho

                    #10
                    Re: Quick way to convert int to array of numbers

                    On Thu, 01 May 2008 06:37:31 -0700, Ben Voigt [C++ MVP]
                    <rbv@nospam.nos pamwrote:
                    [...]
                    >I have now added a check to ensure that negative numbers are flagged
                    >as invalid to prevent this from happening again.
                    >>
                    >The actual code is just for validating the IMEI of a phone.
                    >
                    That's probably long enough to overflow int.
                    He did write, in a more recent post, that his input was typed as long.
                    Though, he could be mistaken and somewhere along the line it's actually an
                    int. That would certainly explain why the number wound up negative at
                    some point.

                    Pete

                    Comment

                    Working...