Don't amputate numberFormat (was: affecting array keys???)
Richard Gaskin
ambassador at fourthworld.com
Sat Apr 22 13:21:59 EDT 2017
Bob Sneidar wrote:
>> On Apr 21, 2017, at 18:23 , Mike Kerner wrote:
>>
>> I tend to agree. There is nothing about "format" that is intuitive
>> to the non-initiated.
>
> A couple years ago I had a look at format. I gave up after I got the
> headache. I tried again today. Same results. I cannot even begin to
> fathom the printf() C rules! I read and read and read, try examples
> etc. but NOTHING can get me to the point where I can make "1.1" into
> "01.10" never mind "10.2.1.6" into "010.002.001.006".
>
> My workaround fixes my issue, and Jacque's works also, provided you
> put the numberFormat into a separate function so that you do not have
> to continually keep resetting the numberformat everytime it might
> affect *ANY* numeric value as text.
There are good benefits to having both numberFormat and the format
function. I don't suppose Mark was serious about deprecating the former,
just making a point about the strength of the latter.
The numberFormat property is something all of us ol' timers are
accustomed to, and in many cases it's a good fit for what we need. So
that, plus decades of legacy code, give us good reasons to keep it around.
But if we step back and review the cognitive implications of using it,
we find a few things worth considering:
NumberFormat requires contextual awareness
------------------------------------------
First and foremost, by itself it doesn't actually do anything, in terms
of things we can see.
When we set the numberFormat, no object nor any variable value changes.
The property's utility only becomes evident in conjunction with
subsequent statements.
So comparing the numberFormat property to the format function by using
single statements isn't apples-to-apples, as numberFormat will always
require at least two statements for it to become in any way evident.
Additionally, as a property of the LC system it's not bound to anything,
an abstraction, and one that changes again without our intervention the
moment the current handler exits.
And then of course there's the reason this thread exists: because the
numberFormat property only affects things that happen after it's set,
the interaction between the property and those subsequent statements
isn't always clear.
If it were we wouldn't be having this discussion. :) And because it's
unclear, we've seen variants of this discussion every few months, even
among people who first learned numberFormat many years ago.
Never underestimate the compounding impact on cognitive load of
multi-statement sequence dependency.
NumberFormat requires data type awareness
-----------------------------------------
xTalks are traditionally typeless, with the respective engines
(HyperCard, SuperCard, OMO, Gain Momentum, Toolbook, LiveCode, etc.)
converting between strings and numbers automatically for us, behind the
scenes. This typelessness allows us to think in terms of what we see
with our human eyes, without having to also conceptualize the
representation of numeric values as they pass through CPU gates. We do
things with what we see in front of us, and it all just works.
Except with the numberFormat property.
Here we have one of the few times in which using an xTalk requires
having at least some awareness that CPUs use different data types for
arithmetic operations than they do for strings.
In some cases, getting what we want from the numberFormat property
requires us to add additional steps in our code in order to coerce the
value we want to be affected. Sometimes we add a zero to coerce a
string to a number, other times we pad or concatenate to coerce a number
to a string. Consider the many examples throughout this thread.
Type coercion in an xTalk? Egads! Yet here we are. :)
At a minimum, the numberFormat property requires at least two statements
to be of any value at all: first setting the property, and then doing
something that will cause it to be applied to a value.
But because we sometimes have to explicitly coerce the value, now and
then we need at least *three* statements to get the result we're looking
for with numberFormat. And when that third step is needed, it's because
we have to momentarily think like a computer.
With GUI objects as part of the core language, xTalks usually afford us
the opportunity to code in a way that expresses the user experience. We
get to think like users, with the engine handling the implementation
details to accommodate the more mundane and arcane needs of the computer.
NumberFormat introduces a moment in which we need to be aware that we're
expressing our user interface in a machine too stupid to count past 1.
:) We don't otherwise need to be aware of binary representations often,
if at all.
Of course some of the options in the format function are also dependent
on understanding data types. But not all of them, and if you do need to
use those that requiring understanding types you still gain the benefit
of having everything in the conversion happening within a single
statement, as opposed to the multi-statement requirements for using the
numberFormat property.
NumberFormat has limited options
--------------------------------
With just two options ("#" for zero-padding where needed, and "0" for
required zero-padding), the scope of the numberFormat property is limited.
By itself that's a point in its favor, since there's not much to learn
about using it (beyond the things noted above).
But it also means that sooner or later you're likely to need to use the
format function anyway, as soon as you want padding for text, or
scientific notation, or any of the other options it provides.
TL;DR
-----
When numberFormat can do the job and you want to use it, use it. For
certain tasks it may be somewhat simpler than the format function.
But when we consider the full cognitive requirements for using
numberFormat, esp. its dependency on multi-statement context, I think it
would be difficult to come up with a cognitive-load metric which could
demonstrate that it's actually easier to learn than the subset of
options needed to get the same result with the format function.
Just because we learned it years ago doesn't mean it's necessarily
easier to learn for anyone else starting out today.
Please remember that the reason we didn't learn the format function back
then it because it didn't exist in any xTalk in those days. :)
Moreover, since the format function covers far more ground, once you
learn the options needed to get simple numeric formatting results you're
already well oriented for learning any other options you might need as
you go later one.
PS: All of these recurring discussions around formatting data reinforce
the value of adding a display formatting property to the field object.
There are still use-cases for both numberFormat and format, but there
are so many precedents in other tools for defining display format in the
object used for display that I think when that's what's needed it would
be the simplest to learn.
--
Richard Gaskin
Fourth World Systems
Software Design and Development for the Desktop, Mobile, and the Web
____________________________________________________________________
Ambassador at FourthWorld.com http://www.FourthWorld.com
More information about the use-livecode
mailing list