3

I am working with a form and would like to print the user's input with the first letter of each word capitalized no matter how they type it in. For example, I want the user's "ronALd SmItH" to print as Rondald Smith. I would also like to do this for the address and city. I have read all of the similar questions and answers on here and they are not working for me. I am not sure if I am putting my code in the wrong place or what I'm doing wrong. This is the code I am using:

    function correctFormat(customer)
    {
      var first = customer.charAt(0).toUpperCase();
      var rest = customer.substring(1).toLowerCase();
      return first + rest;
    }

I have tried placing that in a variety of places within the whole document, I have tried renaming the string (eg. name, city, address). I have also read the others postings on here with what seems like the same question as this but none are working. I am not entering a string that I want capitalized. The user is entering their data into a form and I need it to print in an alert in the correct format. Here is the above code within the entire document. I am sorry it is so long but I am again, at a loss.

<html>

<!--nff Add a title to the Web Page.-->

<head>
<title>Pizza Order Form</title>
<script>

/*nff Add the doClear function to clear the information entered by the user and enter the information to be cleared when the clear entries button is clicked at the bottom of the Web Page.*/
function doClear()
{
var elements = document.getElementsByTagName('select');
elements[0].value = 'PA';

  document.PizzaForm.customer.value = "";
  document.PizzaForm.address.value = "";
  document.PizzaForm.city.value = "";
  document.PizzaForm.state.value = "";
  document.PizzaForm.zip.value = "";
  document.PizzaForm.phone.value = "";
  document.PizzaForm.email.value = "";

  document.PizzaForm.sizes[0].checked = false;
  document.PizzaForm.sizes[1].checked = false;
  document.PizzaForm.sizes[2].checked = false;
  document.PizzaForm.sizes[3].checked = false;

  document.PizzaForm.toppings[0].checked = false;
  document.PizzaForm.toppings[1].checked = false;
  document.PizzaForm.toppings[2].checked = false;
  document.PizzaForm.toppings[3].checked = false;
  document.PizzaForm.toppings[4].checked = false;
  document.PizzaForm.toppings[5].checked = false;
  document.PizzaForm.toppings[6].checked = false;
  document.PizzaForm.toppings[7].checked = false;
  document.PizzaForm.toppings[8].checked = false;
  return;
}

//nff Add a doSubmit button to indicate what the outcome will be when the user clicks the submit order button at the bottom of the form.
function doSubmit()

/*nff Add an if statement to the doSubmit function to return false if there is missing information in the text fields once the user clicks the submit order button.*/

{
  if (validateText() == false) {
    return false;
  }

//nff Add an if statement to the doSubmit function to return false if there is no pizza size selected using the radio buttons.

  if (validateRadio() == false) {
    return false;
  }

//nff Add an if statement to the doSubmit function to return false if there are no toppings selected using the checkboxes.

  if (validateCheckbox() == false) {
    return false;
  }

//nff Add an if statement to the doSubmit function to return false if the email entered by the user is empty or does not fit the acceptable format.

  if (validateEmail() == false) {
    return false;
  }

/*nff Add an if statement to the doSubmit function to return false if the phone number entered by the user is empty or does not fit the acceptable formats.*/

  if (validatePhone() == false) {
    return false;
  }

  if (validateZip() == false) {
    return false;
  }

//nff Add an alert box to show customer information from text fields when the Submit Order button is clicked.

  var customer = document.PizzaForm.customer.value;
  var address = document.PizzaForm.address.value;
  var city = document.PizzaForm.city.value;
  var state = document.PizzaForm.state.value;
  var zip = document.PizzaForm.zip.value;
  var phone = document.PizzaForm.phone.value;
  var email = document.PizzaForm.email.value;

  var size = "";
  for (var i = 0; i < document.PizzaForm.sizes.length; i++) {
    if (document.PizzaForm.sizes[i].checked) {
      size = document.PizzaForm.sizes[i].nextSibling.nodeValue.trim();
      break;
    }
  }

  var toppings = [];
  for (var i = 0; i < document.PizzaForm.toppings.length; i++) {
    if (document.PizzaForm.toppings[i].checked) {
      toppings.push(document.PizzaForm.toppings[i].nextSibling.nodeValue.trim());
    }
  }


  alert("Name: " + customer + '\n' +
    "Address: " + address + '\n' +
    "City: " + city + '\n' +
    "State: " + state + '\n' +
    "Zip: " + zip + '\n' +
    "Phone: " + phone + '\n' +
    "Email: " + email + '\n' +
    "Size: " + size + '\n' + (toppings.length ? 'Toppings: ' + toppings.join(', ') : ''));
}

//nff Add the validateText function to ensure that all text fields are complete before the order is submitted.

function validateText() {
  var customer = document.PizzaForm.customer.value;
  if (customer.length == 0) {
    alert('Name data is missing');
    document.PizzaForm.customer.focus();
    return false
  };
  var address = document.PizzaForm.address.value;
  if (address.length == 0) {
    alert('Address data is missing');
    return false;
  }
  var city = document.PizzaForm.city.value;
  if (city.length == 0) {
    alert('City data is missing');
    return false;
  }
  var state = document.PizzaForm.state.value;
  if (state.length == 0) {
    alert('State data is missing');
    return false;
  }
  var zip = document.PizzaForm.zip.value;
  if (zip.length == 0) {
    alert('Zip data is missing');
    return false;
  }
  var phone = document.PizzaForm.phone.value;
  if (phone.length == 0) {
    alert('Phone data is missing');
    return false;
  }
  var email = document.PizzaForm.email.value;
  if (email.length == 0) {
    alert('Email data is missing');
    return false;
  }
  return true;
}

//nff Add the validateRadio function so that if none of the radio buttons for pizza size are selected it will alert the user.

function validateRadio() {
  if (document.PizzaForm.sizes[0].checked) return true;
  if (document.PizzaForm.sizes[1].checked) return true;
  if (document.PizzaForm.sizes[2].checked) return true;
  if (document.PizzaForm.sizes[3].checked) return true;
  alert('Size of pizza not selected');
  document.PizzaForm.sizes[0].foucs();
  return false;
}

//nff Add the validateCheckbox function so that if none of the checkboxes for toppings are selected it will alert the user.

function validateCheckbox() {
  if (document.PizzaForm.toppings[0].checked) return true;
  if (document.PizzaForm.toppings[1].checked) return true;
  if (document.PizzaForm.toppings[2].checked) return true;
  if (document.PizzaForm.toppings[3].checked) return true;
  if (document.PizzaForm.toppings[4].checked) return true;
  if (document.PizzaForm.toppings[5].checked) return true;
  if (document.PizzaForm.toppings[6].checked) return true;
  if (document.PizzaForm.toppings[7].checked) return true;
  if (document.PizzaForm.toppings[8].checked) return true;
  alert ('Toppings are not selected');
  return false;
  }

//nff Add the validateEmail function to ensure that the email address has been entered in the correct format.

function validateEmail() {  
 if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{3,4})+$/.test(PizzaForm.email.value))  
  {  
    return (true)  
  }  
    alert("You have entered an invalid email address")  
    return (false)  
} 

//nff Add the validatePhone function to ensure that the phone number has been entered in any of the acceptable formats.

function validatePhone() {
  if (/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/.test(PizzaForm.phone.value))
  {
    return (true)
  }
    alert("You have entered an invalid phone number")
    return (false)
}
function validateZip() {
  if (/^\d{5}([\-]\d{4})?$/.test(PizzaForm.zip.value))
  {
    return (true)
  }
    alert("You have entered an invalid zip")
    return (false)
}
function correctFormat(customer)
{
  var first = customer.charAt(0).toUpperCase();
  var rest = name.substring(1).toLowerCase();
  return first + rest;
}
</script>
</head>

<body>

<!--nff Add a form for the user to enter information into.-->

  <form name="PizzaForm">

<!--nff add a title at the top of the Web Page-->

  <h1>The JavaScript Pizza Parlor</h1>

<!--nff add directions to the user for the information to be entered-->

  <p>
  <h4>Step 1: Enter your name, address, and phone number:</h4>

<!--nff change the font-->

  <font face="Courier New">

<!--nff insert a text field for user to enter their name, add spaces between the title of the text box and the box itself, specify the size of the input box, and the type of input into the box as text.-->
    Name: &nbsp;&nbsp;&nbsp;<input name="customer" size="50"
    type="text"><br>

<!--nff insert a text field for user to enter their address, specify the size of the input box, and the type of input into the box as text.-->
    Address: <input name="address" size="50" type="text"><br>

<!--nff Insert a text field for user to enter their city, add spaces between the title of the text box and the box itself, specify the size of the input box, and the type of input into the box as text.-->
    City: &nbsp;&nbsp;&nbsp;<input name="city" size="15" type="text">

<!--nff Insert text fields for the user to enter their state and zip, specify the sizes of the input boxes, and specify that the text to be entered into the boxes will be in all caps for the state box. These input boxes should be on the same line as the last one.-->
    State:<select name="state">
          <option selected value="PA">PA</option>
          <option value="NJ">NJ</option>
          <option value="NY">NY</option>
          <option value="DE">DE</option>
      </select>

    Zip: <input name="zip" size="5" type="text"><br>

<!--nff Insert a text field for the user to enter their phone number, insert spaces after the title of the box, specify the size of the box, and the type of input as text.-->
    Phone: &nbsp;&nbsp;<input name="phone" size="50" type="text"><br>

<!--nff Insert a text field for the user to enter their email address, insert spaces after the title of the box, specify the size of the box, and the type of input as text.-->
    Email: &nbsp;&nbsp;<input name="email" size="50" type="text"><br>
  </font>
 </p>

 <!--nff add second step to order a pizza-->
 <p>
   <h4>Step 2: Select the size of pizza you want:</h4>
   <font face="Courier New">

<!--nff Add radio buttons to choose from four options for pizza sizes.-->
     <input name="sizes" type="radio" value="small">Small
     <input name="sizes" type="radio" value="medium">Medium
     <input name="sizes" type="radio" value="large">Large
     <input name="sizes" type="radio" value="jumbo">Jumbo<br>
   </font>
 </p>
 <p>

  <!--nff add third step to order a pizza-->

   <h4>Step 3: Select the pizza toppings you want:</h4>
   <font face="Courier New">

<!--nff Add check boxes for user to choose toppings.-->
     <input name="toppings" type="checkbox" value="pepperoni">Pepperoni
     <input name="toppings" type="checkbox" value="canadian bacon">Canadian Bacon
     <input name="toppings" type="checkbox" value="sausage">Sausage<br>
     <input name="toppings" type="checkbox" value="mushrooms">Mushrooms
     <input name="toppings" type="checkbox" value="pineapple">Pineapple
     <input name="toppings" type="checkbox" value="black olives">Black Olives<br>
     <input name="toppings" type="checkbox" value="green peppers">Green Peppers
     <input name="toppings" type="checkbox" value="extra cheese">Extra Cheese
     <input name="toppings" type="checkbox" value="none">None<br>
    </font>
   </p>

 <!--nff Add buttons for the options to submit order or clear entries. Add an onClick event to show one of the alerts entered earlier in this document when the submit button is clicked at the bottom of the Web Page. Add and onClick event to clear the entries in this form upon clicking the clear entries button.-->
   <input type="button" value="Submit Order" onClick="doSubmit()">
   <input type="button" value="Clear Entries" onClick="doClear()">
  </form>
</body>

</html>
Nina Fonseca
  • 83
  • 1
  • 7
  • 1
    Didn't manage to read the whole code but why do you use "customer" for the first letter but "name" for the rest of the substring? – ggbranch Jun 04 '15 at 02:11
  • I made an error. I retyped that last attempt at capitalization after trying so many others. After correcting that so that both are as shown above, as "customer" it is still not working for me. I am wondering if I am placing that section of code in the wrong place in the entire document. What do you think? – Nina Fonseca Jun 04 '15 at 02:17
  • I tried to ctrl-f your code but couldn't find where did you call your function. Your function works. https://jsfiddle.net/903apjwm/ – ggbranch Jun 04 '15 at 02:21
  • I am brand new to coding all together so forgive me if this question has an obvious answer...What do you mean by "where did you call your function"? – Nina Fonseca Jun 04 '15 at 02:26
  • possible duplicate of [Convert string to title case with javascript](http://stackoverflow.com/questions/196972/convert-string-to-title-case-with-javascript) – Daniel Jun 04 '15 at 02:57

5 Answers5

2

Your function only capitalizes the first letter of the string but not the first letter of each word. You can try splitting the string into separate words using string.split(' '):

function correctFormat(customer)
{
    if (customer == null || customer.length == 0)
        return customer;
    var words = customer.split(/\s+/g);
    for (var i = 0; i < words.length; ++i) {
        var first = words[i].charAt(0).toUpperCase();
        var rest = words[i].substring(1).toLowerCase();
        words[i] = first + rest;
    }
    return words.join(' ');
}

I also noticed that you do not call correctFormat anywhere. You need to call the function in order for it to be executed. For example:

var customer = correctFormat(document.PizzaForm.customer.value);
AJ Richardson
  • 6,610
  • 1
  • 49
  • 59
  • Where should I call correctFormat? Does that go directly underneath the function itself? – Nina Fonseca Jun 04 '15 at 02:58
  • 1
    @NinaFonseca Call the function wherever you need to use it. You might want to [read up](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions) on functions because it seems that your understanding is limited. I gave an example of how to call it in my answer - when you are reading the value of `customer` from the text box. – AJ Richardson Jun 04 '15 at 03:02
  • I got it! I had to look back to see where to call the function. I have been working on this for days. I am a newbie so this was super difficult for me. Thank you sooooo much! – Nina Fonseca Jun 04 '15 at 03:12
  • 2
    @NinaFonseca This function will not work correctly if words are not separated by space (e.g. if user enters comma or dot, such as "dr.bobby s.smith"). Check my answer for better handling of such inputs: http://stackoverflow.com/a/30634187/4947851 – pisamce Jun 04 '15 at 03:21
2

You can use regular expression, such as this:

function correctFormat(customer){
    return customer.replace(/\b(.)(.*?)\b/g, function(){
        return arguments[1].toUpperCase() + arguments[2].toLowerCase();
    });
}
pisamce
  • 533
  • 2
  • 6
1

As mentioned by @Wee You, you use customer for the first letter but use name for the rest letters. You have to call this function with user inputs and then update text in dom with the correct format.

function correctFormat(str)
{
  var first = str.charAt(0).toUpperCase();
  var rest = str.substring(1).toLowerCase();
  return first + rest;
}
tning
  • 1,231
  • 10
  • 22
  • Yes. I corrected that but unfortunately, that still doesn't resolve my issue. I also tried the code you suggested above and it still doesn't print the output in the correct format. I have tried so many combos including css. – Nina Fonseca Jun 04 '15 at 02:23
  • 1
    You have to get user input string and call `correctFormat(input)`, finally write the correct input to dom. – tning Jun 04 '15 at 02:26
1

Here's a tiny example of the code you need: Pass to the .replace() method every name part:

var PizzaForm = document.PizzaForm;
var customer = PizzaForm.customer;

function formatName() {
  this.value = this.value.replace(/([^ \t]+)/g, function(_, str) {
    var A  = str.charAt(0).toUpperCase();
    var bc = str.substring(1).toLowerCase();
    return A + bc;
  });
}

customer.addEventListener("input", formatName);
<form name="PizzaForm">
  Name:  <input name="customer" size="50" type="text">
</form>

the above will work also on Paste. Have fun


PS: instead of all that doClear(){ wall of code, why don't you reset your form by simply using: PizzaForm.reset();

Roko C. Buljan
  • 196,159
  • 39
  • 305
  • 313
0

Try this function

function correctFormat(customer)
{
  var upperText = customer.toLowerCase();
  var result = upperText.charAt(0).toUpperCase();
  for(var i=1;i<upperText.length;i++)
     if(upperText.charAt(i-1) == ' ') 
        result += upperText.charAt(i).toUpperCase();
     else
        result += upperText.charAt(i);
  return result;
}
Muhammad Nagy
  • 216
  • 1
  • 7