Copy link to clipboard
Copied
I've done this before but seem to be drawing a blank.
I have a variable that has two values in it, I need to split it up so I get both values
example
code=123,456
I need to extra the 123, and the 456
Can anybody remind me of the easy way to do this in CF
Thanks
Mark
Copy link to clipboard
Copied
This is one way.
<cfloop list="#yourstring var#" index="i" delimiters=","> <cfoutput>#x#<br></cfoutput>
</cfloop
Copy link to clipboard
Copied
your code broke up to just CFLOOP, but I remember there was a command, I think it was one of the list commands?
Just found it.. I knew it was simple! LISTFIRST and LISTLAST.. perfect when there are only two values in the string!
Copy link to clipboard
Copied
You can use the function ListGetAt(var, position) also.
Copy link to clipboard
Copied
Usually, I advocate the use of regular expressions. Yeah, it's a bit esoteric the first time you encounter it, but it's actually pretty straightforward and extremely powerful.
Let me first refer you to the very-excellent description that will be found in Using Regular Expressions in Functions, in the ColdFusion Developer's Guide which of course can be found here: http://livedocs.adobe.com/coldfusion/8/htmldocs/.
Now let me try to briefly "set the stage ..."
A regular-expression, briefly, is a string-matching pattern. Let's say that you want to get "123," (with the comma), and "456") given the string "123,456."
First, the (caution: extemporaneous coding!) answer:
parts = REMatchNoCase("([0-9]+\,)([0-9]+)", myString);
Let's look at this string-literal, which is the pattern to be matched. First of all, you observe that it contains two parenthesized parts, back-to-back. (I used bold-face to make it obvious.) The parentheses mean, in each case, that we want to extract the substring that is found to match the enclosed pattern. We want to know where they start in the string and how long they are. So this will give us, on a silver platter as it were, the two strings we're looking for... or a reliable indication that they're not there.
The regular-expression engine is a highly optimized built-in piece of code that uses a pattern as a non-procedural declaration of what you are looking for in a character string, and it will very quickly and very reliably find it.
There are considerable other features that we need not discuss here. Suffice it to say that "this Swiss Army(R) Knife" is full of blades. And bottle-openers and corkscrews and a little tool that I have no idea what it's for but it's making a peculiar buzzing noise..."
Although you might be scared-off by "chicken scratches" at first, you will find yourself using it constantly once you understand how it works. Just include liberal comments into your code so that you'll remember how it works, and of course, test it well. The overwhelming advantage here is that "there is no code." Nary a <CFIF> or a substring-search in sight. Once you master the art of "sight-reading" a regular expression pattern, you can by inspection know that the string will work properly for anything that you might throw at it.
Note: The regular-expression syntax used by CF is fairly standard. There are web-sites which will allow you to test your patterns on-line. There are also on-line libraries of patterns, free for the taking. This is a very fundamental skill that is well worth mastering.
Copy link to clipboard
Copied
Wow, I could program the lunar module with that command! LOL
I think I'll stick with the listfirst, listlast for this particular case.
However, thanks for that very in-depth answer and tutorial, I will go back and read it several times until I get it because I know that the REGEX can be vaery powerful and useful, I've had help putting them together in the past, but never really 'got them'
Thanks
Mark
Copy link to clipboard
Copied
Herein lies the subtle difference between "what works now" and "what works in the general case."
For example: does this requirements-change make you sweat?
"Well, the pieces could actually be separated by a comma or a semicolon or a vertical bar. Hope that's not a problem ..."
"Uh. No... no it isn't... not a problem..."
Sweat equals: the approach that you had been taken happened to work, but now the requirements changed as they always do.
No-Sweat equals: the approach that you took is one that applies to the general case, and that therefore can be modified as-needed without breaking.
For instance, had you used regexes from the start:
parts = REMatchNoCase("([0-9]+[,;])([0-9]+)", myString);
The addition is the bold-faced clause: "[,;]" which matches any one of a set-of characters." Now, either a comma or a semicolon in that position will be accepted. No other changes are necessary. You're ready to quickly handle almost every formatting-change the "garbage-in producers" might have to throw at you. Your code is not only "more reliable now," but it is much more well-prepared to stay that way.
Copy link to clipboard
Copied
understood .. I WILL learn how to do this, I am sure once it's understood that it won't be too difficult.
For this particular case *I* control the creation of the string that it's receiving from another page, so I'm always guaranteed to get what I need
Thanks again for all your time take to explain, truely apppreciated... I hope to pass the quiz , but give me a few weeks! 😉
Mark