• Login
sketchucation logo sketchucation
  • Login
πŸ€‘ SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

Float <-> String - Locale aware?

Scheduled Pinned Locked Moved Developers' Forum
35 Posts 5 Posters 9.0k Views 5 Watching
Loading More Posts
  • 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.
  • T Offline
    thomthom
    last edited by 16 May 2010, 23:15

    No rest for the wicked.

    decimal_separator = 1.2.to_l.to_s.match(/\d(\D)\d/)[1]
    This returns the decimal separator.

    1.23.to_s.tr!('.', decimal_separator)
    And this outputs a float in the user's locale.

    Hacky hacky hacky... 🀒

    Now: how does one do this properly?

    Thomas Thomassen β€” SketchUp Monkey & Coding addict
    List of my plugins and link to the CookieWare fund

    1 Reply Last reply Reply Quote 0
    • T Offline
      thomthom
      last edited by 16 May 2010, 23:17

      @dan rathbun said:

      We can see if the user is using metric, via:

      Still doesn't say anything about the user's decimal separator though. 😞 Only their modelling units.
      An user with English locale might use a metric template.

      And one can set the decimal separator to anything in the system settings.

      Thomas Thomassen β€” SketchUp Monkey & Coding addict
      List of my plugins and link to the CookieWare fund

      1 Reply Last reply Reply Quote 0
      • D Offline
        Dan Rathbun
        last edited by 16 May 2010, 23:33

        @thomthom said:

        Now: how does one do this properly?

        The PROPER Ruby way is to either override a method, or add a new method to the base class. That's why I love Ruby. It's the Dynamic feature of the language.

        Why is it that @Last/Google can override base classes (and do it very poorly/error prone, etc.) and I with 30+ years experience am not supposed to be allowed to?

        Why does noone say anything when Rick Wilson overrides or adds to base classes or Sketchup classes?

        The SKX project is/was a means of proposing/testing such new methods or base class overrides.

        I'm not here much anymore.

        1 Reply Last reply Reply Quote 0
        • D Offline
          Dan Rathbun
          last edited by 17 May 2010, 00:57

          @thomthom said:

          decimal_separator = 1.2.to_l.to_s.match(/\d(\D)\d/)[1]
          This returns the decimal separator.

          1.23.to_s.tr!('.', decimal_separator)
          And this outputs a float in the user's locale.

          No, it returns a String representation of a Float, using the user's locale system decimal separator.
          But .tr/.tr! will change ALL occurances of '.', whereas sub/sub! change only the first occurance.

          πŸ˜† picky, picky

          I'm not here much anymore.

          1 Reply Last reply Reply Quote 0
          • T Offline
            thomthom
            last edited by 17 May 2010, 08:57

            @dan rathbun said:

            But .tr/.tr! will change ALL occurances of '.', whereas sub

            Does it matter?

            Thomas Thomassen β€” SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

            1 Reply Last reply Reply Quote 0
            • T Offline
              thomthom
              last edited by 17 May 2010, 09:13

              @dan rathbun said:

              @thomthom said:

              Now: how does one do this properly?

              The PROPER Ruby way is to either override a method, or add a new method to the base class. That's why I love Ruby. It's the Dynamic feature of the language.

              Why is it that @Last/Google can override base classes (and do it very poorly/error prone, etc.) and I with 30+ years experience am not supposed to be allowed to?

              Why does noone say anything when Rick Wilson overrides or adds to base classes or Sketchup classes?

              The SKX project is/was a means of proposing/testing such new methods or base class overrides.

              Regardless of who does it, overriding base class method in the SU environment is a no-no. One can not know how it will affect other scripts - they could be relying on the original behaviour.
              I would love to override existing methods, but that only works if you have the sole control of the environment. And in SU Ruby, you don't.

              The reason I avoid adding new methods is that one never knows if someone else also adds a method of the same name that does something different. Same problem as before.
              Now, one could go about and prefix with your initial as the conventions are for root modules. But then again, say you create a a plugin that adds a method to a base class. It turns out to have a bug.
              You fix that.
              You then make another plugin with that fix.

              But the a user could have your new plugin and the old bugged version of your first and it loads last overriding the method. Now you're stuck with the bugged version in both your plugins - because you don't have control over the environment your plugin lives on.

              Now, this latter case is more of a problem for yourself, so if one want to do so then fine. But I avoid it.
              But overriding base methods are still a no no.

              I've seen Rick add to base classes. I've not seen him override base methods though.

              @dan rathbun said:

              Why is it that @Last/Google can override base classes (and do it very poorly/error prone, etc.) and I with 30+ years experience am not supposed to be allowed to?

              Because they deploy the platform. They are the source.
              You, me, everyone else got to try to live along side inside that environment without causing conflicts for each others.

              @dan rathbun said:

              The SKX project is/was a means of proposing/testing such new methods or base class overrides.

              Yes - we where even talking with people from Google Sketchup if they thought some of it could cause conflicts.
              Personally that project ended up being down-prioritised for other projects.

              Thomas Thomassen β€” SketchUp Monkey & Coding addict
              List of my plugins and link to the CookieWare fund

              1 Reply Last reply Reply Quote 0
              • T Offline
                thomthom
                last edited by 17 May 2010, 10:21

                Found a nice method:
                http://code.google.com/apis/sketchup/docs/ourdoc/sketchup.html#format_degrees

                It formats any numeral into a string using the user's locale with the model precision.

                Example, Norwegian locale and 1 digit precision:
                Sketchup.format_degrees(500.555)
                Returns the string: "~ 500,6" πŸ˜„

                Now, if only I could find a method for the other way around...

                Thomas Thomassen β€” SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund

                1 Reply Last reply Reply Quote 0
                • J Offline
                  Jim
                  last edited by 17 May 2010, 16:51

                  It's OK to extend only specific instances with with some instance methods, and without modifying the base class.

                  Something like...

                  
                  module Translatable
                      def translate(lang)
                          "Hi"
                      end
                  end
                  
                  str = "Hello"
                  str.extend(Translatable)
                  str.translate("en")
                  
                  
                  

                  Hi

                  1 Reply Last reply Reply Quote 0
                  • D Offline
                    Dan Rathbun
                    last edited by 17 May 2010, 16:57

                    @jim said:

                    It's OK to extend only specific instances with with some instance methods, and without modifying the base class.

                    Called creating a singleton method.

                    I'm not here much anymore.

                    1 Reply Last reply Reply Quote 0
                    • D Offline
                      Dan Rathbun
                      last edited by 17 May 2010, 17:08

                      @thomthom said:

                      Now, if only I could find a method for the other way around...

                      I don't think I can test the other way as my locale setting uses period as decimal point.

                      If your model units are metric, and your OS locale decimal separator is comma, what happens when you try to use the base class (SU extended) method String.to_l ?

                      Ex:
                      length = "5,43".to_l
                      (1) what does length then appear as in the console ?
                      (2) what does it appear as in an inputbox control ?
                      (3) what does it appear as in a webdialog ?

                      What happens when:
                      length = "5.43".to_l

                      I'm not here much anymore.

                      1 Reply Last reply Reply Quote 0
                      • C Offline
                        cjthompson
                        last edited by 17 May 2010, 17:13

                        Why won't "12,2".to_l.to_f work?

                        1 Reply Last reply Reply Quote 0
                        • D Offline
                          Dan Rathbun
                          last edited by 17 May 2010, 17:14

                          @thomthom said:

                          Found a nice method:
                          ...[snip]...
                          Example, Norwegian locale and 1 digit precision:
                          Sketchup.format_degrees(500.555)
                          Returns the string: "~ 500,6" πŸ˜„

                          What happens when:
                          Sketchup.format_degrees(500,555)
                          Wouldn't you be specifying decimals in euro-format?
                          When I try it there is a conflict; Ruby sees the comma as an argument delimiter, and pukes up an argument (2 for 1) exception.

                          I'm not here much anymore.

                          1 Reply Last reply Reply Quote 0
                          • D Offline
                            Dan Rathbun
                            last edited by 17 May 2010, 17:18

                            @cjthompson said:

                            Why won't "12,2".to_l.to_f work?

                            I can't test that; it raises an:
                            <ArgumentError: (eval):0:into_l': Cannot convert "12,2" to Length>` because I think of my US-en locale settings.
                            TT will need to test it, with his euro settings.

                            Of course, "12.2".to_l.to_f works just fine for me (and anyone in the US.)

                            I'm not here much anymore.

                            1 Reply Last reply Reply Quote 0
                            • D Offline
                              Dan Rathbun
                              last edited by 17 May 2010, 17:27

                              @dan rathbun said:

                              @cjthompson said:

                              Why won't "12,2".to_l.to_f work?

                              Of course, "12.2".to_l.to_f works just fine for me (and anyone in the US.)

                              I take that back.

                              I set Format=Decimal, Units=Millimeters, Precision=0.0000mm, and the value returned (in Inches,) is:
                              "12.2".to_l.to_f >> 0.480314960629921
                              which is a precision to 15 decimal places. [FYI: 12.7mm is considered 0.5 inches. You often see 50 caliber weapons expressed as 12.7mm]

                              I'm not here much anymore.

                              1 Reply Last reply Reply Quote 0
                              • T Offline
                                thomthom
                                last edited by 17 May 2010, 19:25

                                @dan rathbun said:

                                (1) what does length then appear as in the console ?

                                length = "5,43".to_l
                                0.213779527559055

                                Because I use metric mm template it also converts the float into inches.

                                @dan rathbun said:

                                (2) what does it appear as in an inputbox control ?

                                2010-05-17 21h23_12.png
                                Because .to_s is called upon the Length object.

                                @dan rathbun said:

                                (3) what does it appear as in a webdialog ?

                                You'd have to convert it to a string to pass it to a webdialog, so the result would be the same as above.

                                Thomas Thomassen β€” SketchUp Monkey & Coding addict
                                List of my plugins and link to the CookieWare fund

                                1 Reply Last reply Reply Quote 0
                                • T Offline
                                  thomthom
                                  last edited by 17 May 2010, 19:26

                                  @dan rathbun said:

                                  What happens when:
                                  length = "5.43".to_l

                                  length = "5.43".to_l Error: #<ArgumentError: (eval):894:into_l': Cannot convert "5.43" to Length>
                                  (eval):894`

                                  Thomas Thomassen β€” SketchUp Monkey & Coding addict
                                  List of my plugins and link to the CookieWare fund

                                  1 Reply Last reply Reply Quote 0
                                  • T Offline
                                    thomthom
                                    last edited by 17 May 2010, 19:27

                                    @cjthompson said:

                                    Why won't "12,2".to_l.to_f work?

                                    "12,2".to_l.to_f 0.480314960629921

                                    It doesn't work because SU does unit conversion at the same time.

                                    Thomas Thomassen β€” SketchUp Monkey & Coding addict
                                    List of my plugins and link to the CookieWare fund

                                    1 Reply Last reply Reply Quote 0
                                    • D Offline
                                      Dan Rathbun
                                      last edited by 17 May 2010, 19:36

                                      Back to the original question, then:

                                      @thomthom said:

                                      Is there any methods that do these conversions that are locale aware?

                                      Are the Sketchup method extensions to the base classes, locale aware and suit your needs ??
                                      String.to_l
                                      Numeric.to_l

                                      I'm not here much anymore.

                                      1 Reply Last reply Reply Quote 0
                                      • T Offline
                                        thomthom
                                        last edited by 17 May 2010, 21:05

                                        @dan rathbun said:

                                        Back to the original question, then:

                                        @thomthom said:

                                        Is there any methods that do these conversions that are locale aware?

                                        Are the Sketchup method extensions to the base classes, locale aware and suit your needs ??
                                        String.to_l
                                        Numeric.to_l

                                        .to_l and Length.to_s is locale aware. But, it does not suit my needs. I'm trying to convert between String and Float, not between String and Length.

                                        As mentioned before:
                                        Sketchup.format_degrees works for Float -> String
                                        It even has the extra benefit of adhering to the model unit's precision.

                                        But for String -> Float (where the string is formatted in the user's locale, which might include decimal separator other than a period) I only have this dirty hack:

                                        
                                          # Some locale settings uses the comma as decimal separator. .to_f does not
                                          # account for this, so all commas must be coverted to periods.
                                          def self.string_to_float(string)
                                            # Dirty hack to get the current locale's decimal separator, which is then
                                            # replaced in the string to a period which is what the .to_f method expects.
                                            @decimal_separator ||= 1.2.to_l.to_s.match(/\d(\D)\d/)[1]
                                            string.sub(@decimal_separator, '.').to_f
                                          end
                                        
                                        

                                        Thomas Thomassen β€” SketchUp Monkey & Coding addict
                                        List of my plugins and link to the CookieWare fund

                                        1 Reply Last reply Reply Quote 0
                                        • D Offline
                                          Dan Rathbun
                                          last edited by 17 May 2010, 23:08

                                          @thomthom said:

                                          .to_l and Length.to_s is locale aware. But, it does not suit my needs. I'm trying to convert between String and Float, ... I only have this dirty hack:

                                          you could subclass class String, and not need the parameter, ie:

                                          class FloatString < String
                                            # override to_f method (or name it .to_loc_f )
                                            def self.to_f
                                              # insert your hack
                                            end
                                          end # class
                                          

                                          Use:
                                          a = FloatString.new( someString.dup ) puts a.to_f puts a.class >> SomeModule::FloatString

                                          I'm not here much anymore.

                                          1 Reply Last reply Reply Quote 0
                                          • 1
                                          • 2
                                          • 1 / 2
                                          1 / 2
                                          • First post
                                            20/35
                                            Last post
                                          Buy SketchPlus
                                          Buy SUbD
                                          Buy WrapR
                                          Buy eBook
                                          Buy Modelur
                                          Buy Vertex Tools
                                          Buy SketchCuisine
                                          Buy FormFonts

                                          Advertisement