break a range of numbers into an array from dialog box

Participant ,
Jan 06, 2021 Jan 06, 2021

Copy link to clipboard

Copied

I'm getting numbers from a dialog and they may be like this, 1-10, 20, 51,60-62 etc. How would I go about checking for the hyphen and creating an array like: 1,2,3,4,5,6,7,8,9,10,20,51,60,61,62 ?

TOPICS
Scripting

Views

210

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 3 Correct Answers

Adobe Community Professional , Jan 06, 2021 Jan 06, 2021
You need to roll your own function:  var getInbetweens = function(first, last, nums) { for (var i = first; i <= last; i++) { nums.push(i.toString()); } } var getFullRange = function(str) { var nums = []; var hyphenSplit; var strArr = str.split(","); for (var i = 0; i < strArr.length; i++) { if (strArr[i].indexOf("-") >=0) { hyphenSplit = strArr[i].split("-"); getInbetweens(parseInt(hyphenSplit[0]), parseInt(hyphenSplit[1]), nums); } else { ...

Likes

Translate

Translate
Most Valuable Participant , Jan 06, 2021 Jan 06, 2021
The same - or not?  var str = "1-10, 20, 51, 60-62"; str = str.replace (/ /g, ""); var arr = str.split(","); var part = null; var result = []; for (i=0; i<=arr.length-1; i++) { if ( arr[i].match (/\d+-\d+/) ) { part = arr[i].split("-"); for (n = part[0]; n <= part[1]; n++) { result.push(n); } } else { result.push(arr[i]); } } alert(result);

Likes

Translate

Translate
Participant , Jan 07, 2021 Jan 07, 2021
Hi, earlier I already make a script for you with a similar task. Remember?https://community.adobe.com/t5/indesign/start-page-number/m-p/11700186?page=1You can take one of functions and receive somthing like this:Array.prototype.indexOf = function(item){ for(var i = 0; i < this.length; i++){if(this[i] === item){return i}} return -1 } function parse(mstr){ var rez = [] for(var i = 0; i < mstr.split(',').length; i++){ if(mstr.split(',')[i] == ''){continue} var mcur = mstr.split(',')[i].sp...

Likes

Translate

Translate
Adobe Community Professional ,
Jan 06, 2021 Jan 06, 2021

Copy link to clipboard

Copied

You need to roll your own function: 

 

var getInbetweens = function(first, last, nums) {
  for (var i = first; i <= last; i++) {
     nums.push(i.toString());
  }
}

var getFullRange = function(str) {
   var nums = [];
   var hyphenSplit;
   var strArr = str.split(",");
   for (var i = 0; i < strArr.length; i++) {
      if (strArr[i].indexOf("-") >=0) { 
         hyphenSplit = strArr[i].split("-");
         getInbetweens(parseInt(hyphenSplit[0]), parseInt(hyphenSplit[1]), nums);
      } else {
         nums.push(strArr[i]);
      }
   }
   return nums;
}

var str = "1-10,20,51,60-62";
var nums = getFullRange(str);

 

You'll probably also want to handle user input errors. Not sure if a string is being return from the dialog box, but you'll probably want to do a .replace on spaces and validate with isNaN. 

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Most Valuable Participant ,
Jan 06, 2021 Jan 06, 2021

Copy link to clipboard

Copied

The same - or not?

😉

 

var str = "1-10, 20, 51, 60-62";

str = str.replace (/ /g, "");
var arr = str.split(",");
var part = null;

var result = [];
for (i=0; i<=arr.length-1; i++) {
    if ( arr[i].match (/\d+-\d+/) ) {
        part = arr[i].split("-");        
        for (n = part[0]; n <= part[1]; n++) {
            result.push(n);
        }
    } else {
        result.push(arr[i]);
        }
    }

alert(result);

 

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

Clever to force the integer type in the for statement. Returning a mix of integers and strings could be dicey, but yes, nice idea. 

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 06, 2021 Jan 06, 2021

Copy link to clipboard

Copied

When I try to $.writeln(nums); to see the result I get the error nums in undefined. 

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jan 06, 2021 Jan 06, 2021

Copy link to clipboard

Copied

Sorry last line should be: 

 

var nums = getFullRange(str); 

 

Then, 

$.writeln(nums);

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Most Valuable Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

Does my version not work for you? Or haven't you tried yet?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

Yes your version worked, thank you. I just wanted to go through both to understand how they worked, which is apparently just outside my ability. 

This part confuses me.

 if ( arr[i].match (/\d+-\d+/) ) {
        part = arr[i].split("-");        
        for (n = part[0]; n <= part[1]; n++) {
            result.push(n);
        }

 

I think... you find digits seperated by a hyphen, then split them by the hypens into seperate strings and assign it to part. Then loop, set n to the first string, and if it's less than or equal to the second sting then add 1. How does it break up the second instance of the hyphn? If I have 1-6, 10-20 wouldn't part[0] be 1 and part[1] be 2?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Most Valuable Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

 

@brianp311  wrote:
"Clever to force the integer type in the for statement. Returning a mix of integers and strings could be dicey, but yes, nice idea. "


If there is error management (to exclude everything but digits) there is an easy way to get digits (just replace in this part with the comments):

 

// the first lines of my code
        for (n = part[0]; n <= part[1]; n++) {
            result.push(n); // n*1 for numbers
        }
    } else {
        result.push(arr[i]); // arr[i]*1 for numbers
        }
// the rest of my code

 

 

Or you use  result.push(Number(arr[i])) or other similar technique for that.

But then it must be ensured that only numbers, spaces and hyphens are passed. Otherwise you'll get a NAN error message.

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Most Valuable Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied



@davidn5918184  wrote:

"… How does it break up the second instance of the hyphn? If I have 1-6, 10-20 wouldn't part[0] be 1 and part[1] be 2? …"

 

 if ( arr[i].match (/\d+-\d+/) ) {
        part = arr[i].split("-"); 

This creates an array - the string has been divided by the hyphen and the hyphen is removed.

For arr[0] = "1-10";

you will get

part = [1, 10];

part[0] = 1;

part[1] = 10;

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

LATEST

Thank you for this explanation. 

 

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

Hi, earlier I already make a script for you with a similar task. Remember?

https://community.adobe.com/t5/indesign/start-page-number/m-p/11700186?page=1

You can take one of functions and receive somthing like this:

Array.prototype.indexOf = function(item){
	for(var i = 0; i < this.length; i++){if(this[i] === item){return i}}
	return -1
}

function parse(mstr){
	var rez = []
	for(var i = 0; i < mstr.split(',').length; i++){
		if(mstr.split(',')[i] == ''){continue}

		var mcur = mstr.split(',')[i].split('-')
		if(mcur[0] == '' && mcur[1] == ''){continue}
		
		var start = mcur[0] == '' ? mcur[1] : mcur[0]
		var end = mcur[1] == '' || typeof mcur[1] == 'undefined' ? mcur[0] : mcur[1]
		
		for(var ii = Number(start); ii <= Number(end); ii++){
			if(rez.indexOf(ii) == -1){rez.push(ii)}
		}
	}
	return rez
}

alert(parse('1-10, 20, 51,60-62'))

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

Yes I remember and thank you.

It does work and I have spent hours trying to understand it.

But I've run into an issue,  your script keeps crashing InDesign and it is outside of my ability to understand why so what I'm really trying to do is figure out why. How it works, how the loop processes it. Ultimately my goal is to get a deeper understanding.

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

Has my script crashed?

https://community.adobe.com/t5/indesign/start-page-number/m-p/11700186?page=1

Have you changed the code?
You can write this instead of the last line:

alert(pages)

start the script, insert into textbox 1-10, 20, 51,60-62 and ... what is happened? I have no problem. 

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

No changes. It worked at first with an occasional crash, and then it just started to crash everytime. 

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

Can you post the code please? I don't understand why it might crash. What OS are you using?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Most Valuable Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

OK.

 

Break;

 

Please continue the discussion about the other (complete) script in the other thread.

 

 

----------------------------------------------------------------------------------------------------------------

 

@davidn5918184 

Now you have three correct answers here in this thread. If you have any questions about any or all of these variants, please ask. Otherwise "you should"

  1. Understand how these variants work and
  2. Mark each of these three answers as Correct Answer.

 

Have fun

😉

 

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jan 07, 2021 Jan 07, 2021

Copy link to clipboard

Copied

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines