On Nov 30, 2011, at 12:44 PM, Nicholas C. Zakas wrote:

> On 11/30/2011 12:01 PM, Brendan Eich wrote:
>> On Nov 29, 2011, at 1:19 PM, Nicholas C. Zakas wrote:
>> 
>>> The reason I started down this path is because the API, as currently 
>>> designed, doesn't fit in with the rest of the JavaScript core language. 
>>> Just to summarize some of my earlier points:
>>> 
>>> 1) No part of core JavaScript uses namespaces today. Having a top-level 
>>> Globalization object that [does] nothing other than provide a hook onto 
>>> which new constructors are placed is a first and doesn't seem very useful. 
>>> At the very least I'd consider killing the Globalization object altogether 
>>> and just let the constructors exist in the global scope.
>> Injecting new names into the global scope is risky, since all the good names 
>> are already taking by user-defined globals.
>> 
>> The plan we discussed a few weeks ago was to use a built-in module, which 
>> could be imported from or declared freely in new opt-in code. Unversioned JS 
>> would have to use something like the
>> 
>>   Object.system.loadIntrinsic("@globalization")
>> 
>> API-sketch.
>> 
>> Whatever we do, it should be as future-friendly to modules as possible, and 
>> it shouldn't inject new global names into the shared scope of ES.next and 
>> unversioned scripts.
> To make sure I understand, are you saying that all future ES functionality 
> won't introduce new names into the global scope?

It depends on what you mean by "scope". The shared global object (the window 
object in the DOM) used today by <script> elements provides shared globals, 
e.g. parseInt. We would like to avoid introducing new names that appear as 
properties of this object, which is on the scope chain for pre-Harmony script, 
in order to avoid collisions.

For the lexical top-level scope in Harmony opt-in code, we can indeed introduce 
new names in the first Harmony edition, but things get harder after that, for 
the same reason: user-defined lexical bindings may collide.


> And further, all new functionality would need to be loaded via a module?

This is a strong "yes", without qualification so far in my view. We intend for 
built-in modules to be accessible to unversioned/pre-Harmony script via the 
heap (Object.system.load...).

There's an open question of whether we import from built-in modules via a 
standard prelude, per the above "we can indeed introduce new names in the first 
Harmony edition". My view based on experience is that, even with further opt-in 
via <script type=...> and |use version N| pragmas, we do not have many chances 
to extend the standard prelude, if there is one.


>>> 2) The current proposal requires that developers maintain a LocaleList 
>>> object and pass that into methods of NumberFormat, DateTimeFormat, and 
>>> Collator (assuming they don't want to use the default). Needing to keep 
>>> track of an object is a pain, but is lessened when that object does 
>>> everything you need it to. That's why I suggested having a Locale object. 
>>> Yes, you'd need to keep track of this object, but at least it would be one 
>>> object instead of multiple objects.
>> This still seems plausible to me. It caters to Norbert's "Customer 
>> categories" 1 and 2, if I'm not mistaken.
> Which is plausible? The current proposal or my single-object proposal? :)

Sorry, "this" referred to your Locale object proposal.


>> So "libraries will handle this" is the wrong guiding principle, but "let's 
>> find the high-level sweet spot" is high-risk without more time for 
>> experimentation and user testing.
> I definitely wasn't trying to suggest a truly high-level abstraction, but 
> more a mid-level API that has some low-level characteristics and some 
> high-level characteristics. Another way to say this is that the API makes the 
> simple case simple ("hi! I'd just like to format a price for display") while 
> allowing more complex cases through other means. I present XMLHttpRequest as 
> a good example of a mid-level API, where it's easy to do a basic GET request 
> but you can still do fancy things using CORS, binary data, HTTP streaming, 
> etc.

I'd call XHR low-level in the typed array or WebGL or canvas sense (ignore API 
size, the issue is semantic level), but ok -- I see your point. The 
counter-arguments based on i18n being harder and different in kind still apply. 
Now what should we do?

/be


> 
>> 
>> I don't have any satisfying answers, but I hope this helps.
>> 
>> /be
>> 
>> 
>>> -N
>>> 
>>> 
>>> On 11/28/2011 4:17 PM, Norbert Lindenberg wrote:
>>>> I'm not sure why this discussion is drifting so far in the direction of a 
>>>> functional API. I thought objects, constructors, and methods are all part 
>>>> of ECMAScript, are widely used in the language specification, in 
>>>> libraries, and in applications, and developers have to understand them in 
>>>> order to be productive in JavaScript. So what is the advantage of 
>>>> isSupportDateTimeFormat(locale) or isSupported("DateTimeFormat", locale) 
>>>> over DateTimeFormat.isSupported(locale)?
>>>> 
>>>> I thought the real question is: How do we enable simpler code for the most 
>>>> common use cases? For example, don't require applications to create a 
>>>> DateTimeFormat object when it's only used once to format a date and then 
>>>> disposed of, or to specify a locale list to every API call when it never 
>>>> changes.
>>>> 
>>>> We should also consider what should be handled by the Globalization API, 
>>>> and what is better left to libraries. We tend to focus on the 
>>>> Globalization API in this discussion because that's what we can change 
>>>> directly, but I think default locale management is really better handled 
>>>> at a higher level. See
>>>> https://mail.mozilla.org/pipermail/es-discuss/2011-November/018665.html
>>>> 
>>>> Specific comments on Nicholas proposal:
>>>> 
>>>> - Extensibility is a big issue: What happens if two components within one 
>>>> application load two incompatible word break implementations - who wins, 
>>>> or is there a way to keep them separate?
>>>> 
>>>> - The existing locale and parameter negotiation won't work with other 
>>>> services: Our current negotiation mechanism knows a lot about collators 
>>>> and number and date formats, and nothing about other internationalization 
>>>> services, and it's not designed for adaptation to such other services. 
>>>> This means other services have to provide their own negotiation, but that 
>>>> conflicts with them being part of a single Locale object.
>>>> 
>>>> - Having the Locale object store the resolved locale doesn't work because 
>>>> the resolved locale can vary between services for the same requested 
>>>> locale list. It probably makes more sense for it to store the requested 
>>>> locale list, and use that to negotiate against each service's 
>>>> capabilities. That's the approach used in YUI internationalization:
>>>> http://yuilibrary.com/yui/docs/intl/
>>>> 
>>>> - The Locale object as proposed doesn't seem to help the application with 
>>>> managing its own resources. YUI, on the other hand, provides support for 
>>>> this, and it seems more logical to extend the locale management in YUI to 
>>>> also support the services provided by the Globalization API than to have 
>>>> two separate mechanisms. For example, it could complement its current 
>>>> number formatting with a new locale sensitive function:
>>>> 
>>>> Y.DataType.Number.localeFormat = function (data, options) {
>>>>     if (Y.Lang.isNumber(data)) {
>>>>         var localeList = Y.config.lang;
>>>>         if (!Y.Lang.isArray(localeList)) {
>>>>             localeList = localeList.split(/[, ]/);
>>>>         }
>>>>         return data.toLocaleString(localeList, options);
>>>>     } else {
>>>>         // do whatever Y.DataType.Number.format does in this case
>>>>     }
>>>> }
>>>> 
>>>> Overall I think a container like the proposed Locale object may make sense 
>>>> at the application level, but doesn't seem like the right approach for the 
>>>> Globalization API.
>>>> 
>>>> Regards,
>>>> Norbert
>>>> 
>>>> 
>>>> 
>>>> 28. новембар 2011. 11.27, Nicholas C. Zakas<[email protected]>   
>>>> је написао/ла:
>>>>> On 11/28/2011 9:15 AM, Nebojša Ćirić wrote:
>>>>>> It's my fault - I read "discussed with Norbert" as if you and Norbert 
>>>>>> agreed on this approach.
>>>>> No worries - email is hard. :)
>>>>> 
>>>>> 
>>>>>> We are essentially choosing beween two approaches:
>>>>>> 
>>>>>> 1. Create an object, query its properties, use object methods (original 
>>>>>> approach)
>>>>>> 2. Create Locale object, call various methods like isSupportedXXX, if 
>>>>>> service is supported use formatYYY or compare
>>>>>> 
>>>>>> They are very similar in what the user has to do (query capabilites, 
>>>>>> call formatters) to get the final result, so I don't think we would lose 
>>>>>> any functionality picking any of those.
>>>>>> 
>>>>>> With 1. we might end up having lots of isSupportedDate, 
>>>>>> isSupportedNumber... after couple of iterations of adding new features 
>>>>>> (like segmentation, calendars, spell check...), but if we follow the 
>>>>>> same naming style I don't see a problem with that.
>>>>> Another approach would be to have a single isSupported() method with 
>>>>> constants that you pass in. That limits the overall API size while still 
>>>>> allowing developers to query capabilities. The DOM has something similar, 
>>>>> though I think the globalization use case is much more appropriate: 
>>>>> http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMFeatures
>>>>> 
>>>>> What would be harder for a third party developer to extend:
>>>>> 
>>>>> isSupported('x') or isSupportedX()
>>>>> 
>>>>> This in case they wanted to provide a service which native implementation 
>>>>> doesn't support (yet).
>>>>> 
>>>>> 
>>>>>> As for the namespace issue, I don't see much difference between Locale 
>>>>>> and Globalization. We discussed Modules on the other thread and came up 
>>>>>> with:
>>>>>> 
>>>>>> Object.system.load('@g11n', callback()) {}
>>>>>> 
>>>>>> or synchronous call
>>>>>> 
>>>>>> var global = Object.system.load('@g11n') {
>>>>>>   return __Globalization__;
>>>>>> }
>>>>>> 
>>>>>> This would become module global import '@g11n' in the future. This 
>>>>>> approach eliminates the need of finding proper name for the namespace 
>>>>>> (and possibly for Locale()?).
>>>>> There's a difference between creating a new native type vs. creating a 
>>>>> namespace. The Locale approach creates a single top-level type and no 
>>>>> other constructors. The current approach, Globalization.*, uses 
>>>>> Globalization only as a namespace and has constructors hanging off of it 
>>>>> - this isn't something that's currently done in ECMAScript.
>>>>> 
>>>>>> Thank you for helping out. Your proposal is exactly what we need at this 
>>>>>> point - to help us refine our work and make it palatable to TC39 members 
>>>>>> :).
>>>>> My pleasure!
>>>>> 
>>>>> 
>>>>>> 24. новембар 2011. 16.47, Nicholas C. Zakas<[email protected]> 
>>>>>>   је написао/ла:
>>>>>> Again, my apologies - I didn't mean to imply that Norbert agreed with 
>>>>>> any of this, just that a few ideas have been more solidified in my mind 
>>>>>> after speaking with him.
>>>>>> 
>>>>>> As a web developer who has built large-scale web sites that have been 
>>>>>> internationalized to dozens of countries, my main purpose in 
>>>>>> contributing to this discussion is to provide feedback on what I would 
>>>>>> have liked to see in such an API to make it useful to me.
>>>>>> 
>>>>>> The current proposal doesn't feel very JavaScript-like, and so I've been 
>>>>>> trying to offer alternatives that make it more JavaScript-like and, 
>>>>>> therefore, more likely to be used by more developers. I'm a bit 
>>>>>> concerned that design decisions seem to have been guided by considering 
>>>>>> the most complex use cases instead of the most common.
>>>>>> 
>>>>>> It is my opinion (and I can only speak for myself) that a single object 
>>>>>> to encompass  would represent a better API for JavaScript than adding a 
>>>>>> namespace, which hasn't been done to this point, and several new types, 
>>>>>> all of which just do one thing. That's a very Java-like approach, and I 
>>>>>> think JavaScript deserves better.
>>>>>> 
>>>>>> As I told Norbert, I'm very happy to lend my experience and insights to 
>>>>>> this process. I realize I may end up bringing things up that you all 
>>>>>> have discussed before - but considering that you did have a single 
>>>>>> Locale object at one point, I'd like to claim "great minds" think alike 
>>>>>> and continue discussing it. :)
>>>>>> 
>>>>>> Happy Thanksgiving.
>>>>>> 
>>>>>> -Nicholas
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> On 11/24/2011 2:44 PM, Norbert Lindenberg wrote:
>>>>>> I didn't agree with this approach, and Nicholas didn't claim that I did 
>>>>>> :-)
>>>>>> 
>>>>>> I'm very glad though that Nicholas is taking the time to provide 
>>>>>> feedback, come up with his own ideas, and discuss them with us. In the 
>>>>>> end, the Globalization API can only be successful if people like him are 
>>>>>> comfortable using the API in their projects, and explain it to others so 
>>>>>> that they're comfortable doing so. Right now, the feedback from him, 
>>>>>> Rick, several TC39 members, and others indicates significant discomfort, 
>>>>>> so we have some work to do. Some of that work may be changes to the API, 
>>>>>> but some may also be better explanation of how to use the API, directly 
>>>>>> from applications or in higher-level libraries.
>>>>>> 
>>>>>> More after Thanksgiving.
>>>>>> 
>>>>>> Norbert
>>>>>> 
>>>>>> 
>>>>>> On Nov 23, 2011, at 15:15 , Nebojša Ćirić wrote:
>>>>>> 
>>>>>> 
>>>>>> 23. новембар 2011. 14.32, Nicholas C. Zakas<[email protected]> 
>>>>>>    је написао/ла:
>>>>>> On 11/23/2011 12:57 PM, Nebojša Ćirić wrote:
>>>>>> Similar approach was proposed (with locale as a top object, others under 
>>>>>> it) and I have nothing against it, but there are some issues with your 
>>>>>> approach:
>>>>>> 
>>>>>> (code == localeID)
>>>>>> 
>>>>>> Sorry for being unclear - I didn't intend for this to be a complete 
>>>>>> alternate proposal, just a starting point. There are definitely still 
>>>>>> issues that would have to be resolved.
>>>>>> 
>>>>>> I just feel we are going in circles sometimes :). I am surprised Norbert 
>>>>>> agreed with this approach - I think he was against top level Locale 
>>>>>> object.
>>>>>> 
>>>>>> 1. An implementation may support NumberFormat for localeID x, but not 
>>>>>> support DateFormat for x (it would need to do a fallback to less 
>>>>>> specific one, or default). That's why we have supportedLocaleOf method 
>>>>>> on each object.
>>>>>> So what you're saying is that there needs to be some way to feature 
>>>>>> detect support for number and date formats separately. That could be 
>>>>>> handled in any number of ways. One that pops to mind would be 
>>>>>> isDateFormatSupported()/isNumberFormatSupported() as an instance method.
>>>>>> 
>>>>>> That would probably work. We could add more methods in the future - say 
>>>>>> one that tells you closest locale to the current one that does support 
>>>>>> service in question.
>>>>>> 
>>>>>> 2. How do you convey status of option/locale resolution to the 
>>>>>> developer? Which options were resolved and to what value (say I ask for 
>>>>>> 'islamic' calendar, but we only have 'gregory' for a given locale). In 
>>>>>> our current proposal we expose resolvedOptions accessor on i.e. 
>>>>>> DateTimeFormat object instance that has 'calendar' property, so a 
>>>>>> developer can decide what to         do.
>>>>>> Thanks, I was having trouble understanding what resolvedOptions was used 
>>>>>> for. Could the use case be handled by having a similar object on a 
>>>>>> Locale instance? It seems like you could include options for available 
>>>>>> calendars and anything else that developers could query against, such as:
>>>>>> 
>>>>>> 
>>>>>>     var locale = new Locale();
>>>>>>     if (locale.supportedOptions.islamicCalendar){
>>>>>>         //foo
>>>>>>     }
>>>>>> 
>>>>>> You could also go a more traditional direction (at least in terms of DOM 
>>>>>> objects), by doing something like:
>>>>>> 
>>>>>>     Locale.CALENDAR_ISLAMIC = 1;
>>>>>>     Locale.CALENDAR_GREGORIAN = 2;
>>>>>> 
>>>>>> 
>>>>>>     var locale = new Locale();
>>>>>>     locale.isSupported(Locale.CALENDAR_ISLAMIC);
>>>>>> 
>>>>>> I think feature detection is an easily solved problem if everything else 
>>>>>> is in place.
>>>>>> 
>>>>>> Sometimes options can influence each other. For example:
>>>>>> 
>>>>>> 1. Ask for th locale (Thai)
>>>>>> 2. There are two calendars available - buddhist and gregory
>>>>>> 3. There are two numbering systems available - thai and latin
>>>>>> 
>>>>>> but only buddhist + thai and gregory + latin combinations are supported.
>>>>>> 
>>>>>> If you ask locale.isSupported('calendar': 'buddhist') you'll get true. 
>>>>>> If you ask locale.isSupported('numberingSystem', 'latin') you'll get 
>>>>>> true again. If you try to format date using that combination (thai + 
>>>>>> latin) you'll get something you didn't expect.
>>>>>> 
>>>>>> I would propose sligthly different isSupported method:
>>>>>> 
>>>>>> locale.returnSupported(serviceName, options), where serviceName is one 
>>>>>> of 'dateFormat', 'numberFormat', 'collator', options object contains 
>>>>>> requested settings (calendar, numbering system, collation options...) 
>>>>>> and method returns the object with supported features for a given 
>>>>>> service.
>>>>>> 3. This approach would require internal caching of 
>>>>>> collator/dateformatter/numberformatter objects.
>>>>>> That's an implementation detail. I'm more interested in defining an 
>>>>>> usable and relatively intuitive API before worrying about optimization.
>>>>>> 
>>>>>> I agree, it's implementation detail, but you will need to pass format 
>>>>>> parameter to each call of .format() method. I don't think that's a big 
>>>>>> problem. Also I would move format and option parameters to the last 
>>>>>> position (can be optional), so that user can specify only value and rely 
>>>>>> on defaults.
>>>>>> 23. новембар 2011. 12.09, Nicholas C. Zakas<[email protected]> 
>>>>>>    је написао/ла:
>>>>>> After meeting with Norbert to discuss the use cases and design decision 
>>>>>> rationale, I've come to a different understanding of the goals of the 
>>>>>> globalization API. Some things I learned:
>>>>>> 
>>>>>> 1. Augmenting native types with some default locale support may be 
>>>>>> dangerous. Consider the case where a single web page displays two 
>>>>>> modules with different locales. Which one wins? Therefore, "default" 
>>>>>> locale behavior for native types is impractical.
>>>>>> 2. Locale information is most frequently used for formatting numbers and 
>>>>>> dates as well as comparing strings. The locale information doesn't 
>>>>>> permeate the entire execution context.
>>>>>> 3. Developers are likely to want to define locale information once and 
>>>>>> then reuse that multiple times through a script.
>>>>>> 
>>>>>> Given this, I'd like to propose an alternate approach to the one 
>>>>>> currently taken in the API and also different from my initial email. It 
>>>>>> goes like this:
>>>>>> 
>>>>>> Have a single, top-level type called Locale defined as:
>>>>>> 
>>>>>>    function Locale(code){
>>>>>> 
>>>>>>        //whatever has to happen to process the code
>>>>>> 
>>>>>>        this.code = code;
>>>>>>    }
>>>>>> 
>>>>>>    /*
>>>>>>     * Determine if a locale is supported.
>>>>>>     * @param code The code to check.
>>>>>>     * @return True if supported, false if not.
>>>>>>     */
>>>>>>    Locale.isLocaleSupported = function(code){
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>>    /*
>>>>>>     * Replaces supportedLocalesOf
>>>>>>     * @param code The code to check.
>>>>>>     * @return Array of supported locales.
>>>>>>     */
>>>>>>    Locale.getSupportedLocales = function(code){
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>>    /*
>>>>>>     * Replaces Globalization.Collator
>>>>>>     * @param a The first item.
>>>>>>     * @param b The second item.
>>>>>>     * @param options (Optional) The options to use when comparing.
>>>>>>     * @return -1 if a comes before b, 0 if they're equal, 1 otherwise
>>>>>>     */
>>>>>>    Locale.prototype.compare = function(a, b, options){
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>>    /*
>>>>>>     * Replaces Globalization.NumberFormat
>>>>>>     * @param format A pattern format string for outputting the number.
>>>>>>     * @param value The value to format.
>>>>>>     * @return The number formatted as a string.
>>>>>>     */
>>>>>>     Locale.prototype.formatNumber = function(format, value){
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>>    /*
>>>>>>     * Replaces Globalization.DateFormat
>>>>>>     * @param format A pattern format string for outputting the date.
>>>>>>     * @param value The date to format.
>>>>>>     * @return The number formatted as a string.
>>>>>>     */
>>>>>>    Locale.prototype.formatDate = function(format, value){
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>> You would then be able to create a single Locale instance and have that 
>>>>>> be used in your script. If the constructor is used without an argument, 
>>>>>> then default locale information is used:
>>>>>> 
>>>>>>    var locale = new Locale();
>>>>>> 
>>>>>> If you provide a code, then that is used:
>>>>>> 
>>>>>>    var locale = new Locale("en-us");
>>>>>> 
>>>>>> If you provide multiple codes, then the first supported one is used:
>>>>>> 
>>>>>>    var locale = new Locale(["en-us", "en-gb"]);
>>>>>> 
>>>>>> Then, you can use that locale information for the other operations you 
>>>>>> want to do:
>>>>>> 
>>>>>>    locale.formatDate("DMYs-short", new Date());
>>>>>>    locale.formatNumber("##.##", 55);
>>>>>>    locale.compare("foo", "bar");
>>>>>> 
>>>>>> By the way, not saying this is the format pattern string that should be 
>>>>>> used, it's just for discussion.
>>>>>> 
>>>>>> I like having a single object to deal with instead of multiple for 
>>>>>> everything the API is trying to do. It seems a lot more intuitive than 
>>>>>> needing to manage a LocaleList that is passed into new instances of 
>>>>>> NumberFormat and DateFormat all the time (that's a bunch of housekeeping 
>>>>>> for developers).
>>>>>> 
>>>>>> Thoughts?
>>>>>> 
>>>>>> -Nicholas
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> On 11/21/2011 11:12 AM, Nicholas C. Zakas wrote:
>>>>>> As promised, more verbose feedback for the Globalization API. My general 
>>>>>> feeling is that the API is overly verbose for what it's doing. I'll 
>>>>>> state my bias up front: I'm not a fan of introducing a bunch of new 
>>>>>> types to handle formatting. I'd much rather have additional methods that 
>>>>>> perform formatting on existing objects. My feedback is mostly about 
>>>>>> eliminating the new constructors - which has an added bonus of 
>>>>>> eliminating the Globalization namespace because there would be only one 
>>>>>> constructor left: Collator.
>>>>>> 
>>>>>> 1. LocaleList
>>>>>> 
>>>>>> I'm not sure why this type is necessary. I don't believe that locale 
>>>>>> resolution is an expensive operation, and even if it is, I'd expect the 
>>>>>> implementation to cache the results of such resolution for later use. 
>>>>>> I'd just leave this as an internal construct and instruct developers to 
>>>>>> use arrays all the time.
>>>>>> 
>>>>>> 2. supportedLocalesOf
>>>>>> 
>>>>>> I find this method name strange - I've read it several times and am 
>>>>>> still not sure I fully understand what it does. Perhaps 
>>>>>> "getSupportedLocales()" is a better name for this method? (I always 
>>>>>> prefer methods begin with verbs.)
>>>>>> 
>>>>>> 3. NumberFormat
>>>>>> 
>>>>>> Number formatting seems simple enough that it could just be added as a 
>>>>>> series of methods on Number.prototype. The three types of formatting 
>>>>>> (currency, decimal, percent) could each have their own method. Currency 
>>>>>> formatting has relatively few options to specify, so it's method can be:
>>>>>> 
>>>>>>    /*
>>>>>>     * Formats the number as if it were currency
>>>>>>     * @param code Currency code, e.g., "EUR"
>>>>>>     * @param type (Optional) The way to format the currency code, 
>>>>>> "code", "symbol" (default),
>>>>>>     * @param locales - (Optional) Array of locales to use.
>>>>>>     */
>>>>>>    Number.prototype.toCurrencyString = function(code, type, locales) {
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>>    var num = 500;
>>>>>>    console.log(num.toCurrencyCode("EUR", "code"));    //"EUR 500.00"
>>>>>> 
>>>>>> 
>>>>>> Decimal and percent formatting options are slightly different in that 
>>>>>> they include significant digits options. For that, I prefer to use a 
>>>>>> formatting string rather than the multitude of optional properties as 
>>>>>> currently defined (see 
>>>>>> http://www.exampledepot.com/egs/java.text/FormatNum.html). The 
>>>>>> formatting string indicates must-have digits as 0 and optional digits as 
>>>>>> #, allowing you to very succinctly specify how you want your number to 
>>>>>> be output. For example:
>>>>>> 
>>>>>>    /*
>>>>>>     * Formats the number as a decimal string.
>>>>>>     * @param format Format string indicating max/min significant digits
>>>>>>     * @param locales (Optional) Array of locales to use.
>>>>>>     */
>>>>>>    Number.prototype.toDecimalString = function(format, locales){
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>>    /*
>>>>>>     * Formats the number as a percent string.
>>>>>>     * @param format Format string indicating max/min significant digits
>>>>>>     * @param locales (Optional) Array of locales to use.
>>>>>>     */
>>>>>>    Number.prototype.toPercentString = function(format, locales){
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>>    var num = 1234.567;
>>>>>>    console.log(numtoDecimalString("000##.##")); "01234.57"
>>>>>> 
>>>>>> 4. DateTimeFormat
>>>>>> 
>>>>>> As with NumberFormat, it seems like this could more succinctly be 
>>>>>> implemented as a method on Date.prototype. As its easiest:
>>>>>> 
>>>>>>    /*
>>>>>>     * Format a date
>>>>>>     * @param options The already-defined options for DateTimeFormat
>>>>>>     * @param locales (Optional) Array of locales to use.
>>>>>>     */
>>>>>>    Date.prototype.toFormatString = function(options, locales){
>>>>>>        ...
>>>>>>    };
>>>>>> 
>>>>>> In an ideal world, I'd like to see options overloaded so it can be an 
>>>>>> options object as specified now or a formatting string. I understand 
>>>>>> that there was a sentiment against formatting strings due to their 
>>>>>> limitations and edge case errors. However, I'd like to point out that 
>>>>>> any internationalized web application is highly likely to already be 
>>>>>> using formatting strings for dates, since this is pretty much how every 
>>>>>> other language handles date formatting. That means supporting format 
>>>>>> strings in JavaScript would allow application developers to reuse the 
>>>>>> settings they already have. As it stands now, you'd need to create two 
>>>>>> different ways of formatting dates for a web app: one for your 
>>>>>> server-side language and one for your client-side language (until the 
>>>>>> day everything is running on Node.js, of course). I'd prefer my 
>>>>>> client-side code to reuse settings and configuration that the 
>>>>>> server-side code uses, otherwise I end up with two very different pieces 
>>>>>> of code doing the exact same thing, and there be dragons.
>>>>>> 
>>>>>> -Nicholas
>>>>>> 
>>>>>> _______________________________________________
>>>>>> es-discuss mailing list
>>>>>> [email protected]
>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>> Nebojša Ćirić
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>> Nebojša Ćirić
>>>>>> _______________________________________________
>>>>>> es-discuss mailing list
>>>>>> [email protected]
>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>> Nebojša Ćirić
>>>>> 
>>>>> 
>>>>> -- 
>>>>> Nebojša Ćirić
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> [email protected]
>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>> 
>>> _______________________________________________
>>> es-discuss mailing list
>>> [email protected]
>>> https://mail.mozilla.org/listinfo/es-discuss
> 
> 

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to