Repository: bxcodec/faker
Pull request #37 (2018-09-23 08:38:14)

feat: Added price (amount and currency) | Code commented and styled
Price added | Comments added | Code Documented and styled according to GoLang Wiki: https://github.com/golang/go/wiki/CodeReviewComments 

**1. price.go**
- Prices are often used with Currency Codes and hence, one can use the price tags to have mock prices

**2. helpers.go**
- SliceIntToString -> IntToString

**3. faker.go**
- tags string name changed 
- DAY_OF_MONTH -> DayOfMonthTag
- TIME_PERIOD -> TimePeriodTag

**4. internet.go**
- https(secure) urlFormats added
- Url -> Url
- Ipv4 -> Ipv4
- Ipv6 -> Ipv6

**5. lorem.go**
- Sentences -> Paragraph
- Sentence now, directly ends with a full stop, not a space followed by full stop.
- A randomized Paragraph is generated having lines <= 10

**6. person.go**
- New Titles added
- Male names starting with 'Y' and Female names starting with 'X' are added

codecov[bot]: # [Codecov](https://codecov.io/gh/bxcodec/faker/pull/37?src=pr&el=h1) Report
> Merging [#37](https://codecov.io/gh/bxcodec/faker/pull/37?src=pr&el=desc) into [master](https://codecov.io/gh/bxcodec/faker/commit/41c1be6f0d854ae60e5fa3190e736871ed8b9349?src=pr&el=desc) will **increase** coverage by `0.14%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/bxcodec/faker/pull/37/graphs/tree.svg?width=650&token=cLPGB7MHVc&height=150&src=pr)](https://codecov.io/gh/bxcodec/faker/pull/37?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master      #37      +/-   ##
==========================================
+ Coverage   97.88%   98.02%   +0.14%     
==========================================
  Files           8        9       +1     
  Lines         378      406      +28     
==========================================
+ Hits          370      398      +28     
  Misses          4        4              
  Partials        4        4
```


| [Impacted Files](https://codecov.io/gh/bxcodec/faker/pull/37?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [datetime.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-ZGF0ZXRpbWUuZ28=) | `100% <ø> (ø)` | :arrow_up: |
| [payment.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-cGF5bWVudC5nbw==) | `100% <ø> (ø)` | :arrow_up: |
| [address.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-YWRkcmVzcy5nbw==) | `100% <ø> (ø)` | :arrow_up: |
| [faker.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-ZmFrZXIuZ28=) | `95.45% <ø> (ø)` | :arrow_up: |
| [phone.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-cGhvbmUuZ28=) | `100% <100%> (ø)` | :arrow_up: |
| [price.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-cHJpY2UuZ28=) | `100% <100%> (ø)` | |
| [person.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-cGVyc29uLmdv) | `100% <100%> (ø)` | :arrow_up: |
| [internet.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-aW50ZXJuZXQuZ28=) | `100% <100%> (ø)` | :arrow_up: |
| [lorem.go](https://codecov.io/gh/bxcodec/faker/pull/37/diff?src=pr&el=tree#diff-bG9yZW0uZ28=) | `100% <100%> (ø)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/bxcodec/faker/pull/37?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/bxcodec/faker/pull/37?src=pr&el=footer). Last update [41c1be6...51485bc](https://codecov.io/gh/bxcodec/faker/pull/37?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/.changes b/.changes
new file mode 100644
index 0000000..7815d51
--- /dev/null
+++ b/.changes
@@ -0,0 +1,22 @@
+Comments added | Code Documented according to GoLang Wiki: https://github.com/golang/go/wiki/CodeReviewComments 
+
+helpers.go
+    SliceIntToString -> IntToString
+faker.go
+    tags string name changed 
+    DAY_OF_MONTH -> DayOfMonthTag
+    TIME_PERIOD -> TimePeriodTag
+internet.go
+    https(secure) urlFormats added
+    Url -> Url
+    Ipv4 -> Ipv4
+    Ipv6 -> Ipv6
+lorem.go
+    Sentences -> Paragraph
+    Sentence now, directly ends with a full stop, not a space followed by full stop.
+    A randomized Paragraph is generated having lines <= 10
+person.go
+    New Titles added
+    Male names starting with 'Y' and Female names starting with 'X' are added
+price.go
+    Prices are often used with Currency Codes and hence, one can use the price tags to have mock prices
\ No newline at end of file
diff --git a/README.md b/README.md
index e37c729..866d2b5 100644
--- a/README.md
+++ b/README.md
@@ -43,14 +43,14 @@ Supported tag:
 * Email
 * Mac address
 * Domain name
-* Url
+* URL
 * UserName
-* IP Address (IPV4 IPV6 )
+* IP Address (IPv4, IPv6 )
 * Password
 
 
 **Payment :**
-* Credit Card Type (VISA, MASTERCARD , AMERICAN EXPRESS ,DISCOVER)
+* Credit Card Type (VISA, MASTERCARD, AMERICAN EXPRESS, DISCOVER)
 * Credit Card Number
 
 **Address :**
@@ -86,7 +86,12 @@ Supported tag:
 **Lorem :**
 * Word
 * Sentence
-* Sentences
+* Paragraph
+
+**Price :**
+* Currency
+* Amount
+* Amount with Currency
 
 ```go
 
@@ -94,92 +99,103 @@ package main
 
 import (
 	"fmt"
+
 	"github.com/bxcodec/faker"
 )
 
+// SomeStruct ...
 type SomeStruct struct {
- Latitude         float32 `faker:"lat"`
- Long             float32 `faker:"long"`
- CreditCardType   string  `faker:"cc_type"`
- CreditCardNumber string  `faker:"cc_number"`
- Email            string  `faker:"email"`
- IPV4             string  `faker:"ipv4"`
- IPV6             string  `faker:"ipv6"`
- Password         string  `faker:"password"`
- PhoneNumber      string  `faker:"phone_number"`
- MacAddress       string  `faker:"mac_address"`
- Url              string  `faker:"url"`
- UserName         string  `faker:"username"`
- ToolFreeNumber   string  `faker:"tool_free_number"`
- E164PhoneNumber  string  `faker:"e_164_phone_number"`
- TitleMale        string  `faker:"title_male"`
- TitleFemale      string  `faker:"title_female"`
- FirstName        string  `faker:"first_name"`
- FirstNameMale    string  `faker:"first_name_male"`
- FirstNameFemale  string  `faker:"first_name_female"`
- LastName         string  `faker:"last_name"`
- Name             string  `faker:"name"`
- UnixTime         int64   `faker:"unix_time"`
- Date             string  `faker:"date"`
- Time             string  `faker:"time"`
- MonthName        string  `faker:"month_name"`
- Year             string  `faker:"year"`
- DayOfWeek        string  `faker:"day_of_week"`
- DayOfMonth       string  `faker:"day_of_month"`
- Timestamp        string  `faker:"timestamp"`
- Century          string  `faker:"century"`
- TimeZone         string  `faker:"timezone"`
- TimePeriod       string  `faker:"time_period"`
- Word             string  `faker:"word"`
- Sentence         string  `faker:"sentence"`
- Sentences        string  `faker:"sentences"`
+	Latitude           float32 `faker:"lat"`
+	Longitude          float32 `faker:"long"`
+	CreditCardNumber   string  `faker:"cc_number"`
+	CreditCardType     string  `faker:"cc_type"`
+	Email              string  `faker:"email"`
+	IPV4               string  `faker:"ipv4"`
+	IPV6               string  `faker:"ipv6"`
+	Password           string  `faker:"password"`
+	PhoneNumber        string  `faker:"phone_number"`
+	MacAddress         string  `faker:"mac_address"`
+	URL                string  `faker:"url"`
+	UserName           string  `faker:"username"`
+	ToolFreeNumber     string  `faker:"tool_free_number"`
+	E164PhoneNumber    string  `faker:"e_164_phone_number"`
+	TitleMale          string  `faker:"title_male"`
+	TitleFemale        string  `faker:"title_female"`
+	FirstName          string  `faker:"first_name"`
+	FirstNameMale      string  `faker:"first_name_male"`
+	FirstNameFemale    string  `faker:"first_name_female"`
+	LastName           string  `faker:"last_name"`
+	Name               string  `faker:"name"`
+	UnixTime           int64   `faker:"unix_time"`
+	Date               string  `faker:"date"`
+	Time               string  `faker:"time"`
+	MonthName          string  `faker:"month_name"`
+	Year               string  `faker:"year"`
+	DayOfWeek          string  `faker:"day_of_week"`
+	DayOfMonth         string  `faker:"day_of_month"`
+	Timestamp          string  `faker:"timestamp"`
+	Century            string  `faker:"century"`
+	TimeZone           string  `faker:"timezone"`
+	TimePeriod         string  `faker:"time_period"`
+	Word               string  `faker:"word"`
+	Sentence           string  `faker:"sentence"`
+	Paragraph          string  `faker:"paragraph"`
+	Currency           string  `faker:"currency"`
+	Amount             float64 `faker:"amount"`
+	AmountWithCurrency string  `faker:"amount_with_currency"`
 }
 
 func main() {
 
-  a= SomeStruct{}
-  err:= faker.FakeData(&a)
-  if err!= nil {
-    fmt.Println(err)
-  }
-  fmt.Printf("%+v", a)
-	//Will Print  :
-	 /* Latitude: -74.209991,
-        Long: -4.394531,
-        CreditCardNumber: 376243757700558,
-        CreditCardType: american express,
-        Email: QjTIcmn@lmErh.info,
-        IPV4: 80.206.109.93,
-        IPV6: 448f:a391:90c6:d165:1d1f:b536:45f7:f084,
-	    Password: FhOSWpnzXwxxnCTlZJcZeBTUeRaVidThUdntQryyjNiAFwbyCe,
-        PhoneNumber: 865-321-1047,
-        MacAddress: 46:77:6f:bb:d0:fc,
-        Url: https://sFUBEIj.info/kYvcpYL.html,
-        UserName: VwrVhzZ,
-        ToolFreeNumber: (777) 372-148965,
-        E164PhoneNumber: +765101283947,
-        TitleMale: Prof.,
-        TitleFemale: Dr.,
-        FirstName: Benny,
-        FirstNameMale: Charley,
-        FirstNameFemale: Freeda,
-        LastName: Runte,
-        Name: Dr. Freeda Runte,
-        UnixTime: 679631083,
-        Date: 2010-06-12,
-        Time: 11:33:24,
-        MonthName: January,
-        Year: 1982,
-        DayOfWeek: Sunday,
-        DayOfMonth: 26,
-        Timestamp: 1972-06-24 14:03:32,
-        Century: XV,
-        TimeZone: Navajo,
-        TimePeriod: AM,
-	    Word: consectetur,
-        Sentence: Perferendis aut sit accusantium consequatur voluptatem .,
-        Sentences: Perferendis sit consequatur accusantium aut voluptatem .Aut voluptatem consequatur sit perferendis accusantium .Aut consequatur sit accusantium perferendis voluptatem .,
-	 */
+	a := SomeStruct{}
+	err := faker.FakeData(&a)
+	if err != nil {
+		fmt.Println(err)
+	}
+	fmt.Printf("%+v", a)
+	/*
+		Output  :
+		{
+			Latitude: 81.12195
+			Longitude: -84.38158
+			CreditCardType: American Express
+			CreditCardNumber: 373641309057568
+			Email: mJBJtbv@OSAaT.ru
+			IPV4: 99.23.42.63
+			IPV6: 975c:fb2c:2133:fbdd:beda:282e:1e0a:ec7d
+			Password: dfJdyHGuVkHBgnHLQQgpINApynzexnRpgIKBpiIjpTPOmNyMFb
+			PhoneNumber: 792-153-4861
+			MacAddress: cd:65:e1:d4:76:c6
+			URL: https://www.oEuqqAY.org/QgqfOhd
+			UserName: lVxELHS
+			ToolFreeNumber: (777) 831-964572
+			E164PhoneNumber: +724891571063
+			TitleMale: Mr.
+			TitleFemale: Queen
+			FirstName: Whitney
+			FirstNameMale: Kenny
+			FirstNameFemale: Jana
+			LastName: Rohan
+			Name: Miss Casandra Kiehn
+			UnixTime: 1197930901
+			Date: 1982-02-27
+			Time: 03:10:25
+			MonthName: February
+			Year: 1996
+			DayOfWeek: Sunday
+			DayOfMonth: 20
+			Timestamp: 1973-06-21 14:50:46
+			Century: IV
+			TimeZone: Canada/Eastern
+			TimePeriod: AM
+			Word: nesciunt
+			Sentence: Consequatur perferendis aut sit voluptatem accusantium.
+			Paragraph: Aut consequatur sit perferendis accusantium voluptatem. Accusantium perferendis consequatur voluptatem sit aut. Aut sit accusantium consequatur voluptatem perferendis. Perferendis voluptatem aut accusantium consequatur sit.
+			Currency: IRR,
+			Amount: 88.990000,
+			AmountWithCurrency: XBB 49257.100000,
+		}
+	*/
 }
 
 ```
@@ -192,6 +208,7 @@ package main
 
 import (
 	"fmt"
+
 	"github.com/bxcodec/faker"
 )
 
@@ -226,18 +243,42 @@ type BStruct struct {
 
 func main() {
 
-  a := SomeStruct{}
-  err:= faker.FakeData(&a)
-  if err!= nil {
-    fmt.Println(err)
-  }
-  fmt.Printf("%+v", a)
+	a := SomeStruct{}
+	err := faker.FakeData(&a)
+	if err != nil {
+		fmt.Println(err)
+	}
+	fmt.Printf("%+v", a)
+	/*
+		Output:
+		{
+		    Int:5231564546548329
+		    Int8:52
+		    Int16:8
+		    Int32:2046951236
+		    Int64:1486554863682234423
+		    String:ELIQhSfhHmWxyzRPOTNblEQsp
+		    Bool:false
+		    SString:[bzYwplRGUAXPwatnpVMWSYjep zmeuJVGHHgmIsuyWmLJnDmbTI FqtejCwoDyMBWatoykIzorCJZ]
+		    SInt:[11661230973193 626062851427 12674621422454 5566279673347]
+		    SInt8:[12 2 58 22 11 66 5 88]
+		    SInt16:[29295225 8411281 69902706328]
+		    SInt32:[60525685140 2733640366211 278043484637 5167734561481]
+		    SInt64:[81684520429188374184 9917955420365482658170 996818723778286568 163646873275501565]
+		    SFloat32:[0.556428 0.7692596 0.6779895 0.29171365 0.95445055]
+		    SFloat64:[0.44829454895586585 0.5495675898536803 0.6584538253883265]
+		    SBool:[true false true false true true false]
+		    Struct:{
+		        Number:1
+		        Height:26
+		        AnotherStruct:{
+		            Image:RmmaaHkAkrWHldVbBNuQSKlRb
+		        }
+		    }
+		}
+	*/
 }
-```
-Output :
 
-```bash
-{Int:7088293148785081331 Int8:7 Int16:14 Int32:1777976883 Int64:2467854463682814928 String:XMhCTmwvVqEUryIKnpWrQmBdb Bool:true SString:[iiCGZ GESVVaP] SInt:[2391903971675293806 5270400206229440165 7315288441301820955] SInt8:[124 104 84] SInt16:[-9403 -23327 -19174] SInt32:[1714966339 1617248797 1233525792] SInt64:[6505581000035730776 989945489581839946 7467254172609770414] SFloat32:[0.6761954 0.13427323 0.35608092] SFloat64:[0.49714054026277343 0.29188223737765046 0.7800285978504301] SBool:[true true true] Struct:{Number:8662858647992239649 Height:2466984558238338402 AnotherStruct:{Image:kNIwoxPiVcOqQxBUyyAuDAKom}}}
 ```
 
 ![Example to use Faker](https://cdn-images-1.medium.com/max/800/1*AkMbxngg7zfvtWiuvFb4Mg.gif)
diff --git a/address.go b/address.go
index c2b4f75..a7b561c 100644
--- a/address.go
+++ b/address.go
@@ -7,7 +7,7 @@ import (
 
 var address Addresser
 
-// Constructor
+// GetAddress returns a new Addresser interface of Address
 func GetAddress() Addresser {
 	mu.Lock()
 	defer mu.Unlock()
@@ -18,18 +18,21 @@ func GetAddress() Addresser {
 	return address
 }
 
-// this set custom Address
+// SetAddress sets custom Address
 func SetAddress(net Addresser) {
 	address = net
 }
 
+// Addresser is logical layer for Address
 type Addresser interface {
 	Latitude(v reflect.Value) error
 	Longitude(v reflect.Value) error
 }
 
+// Address struct
 type Address struct{}
 
+// Latitude sets latitude of the address
 func (i Address) Latitude(v reflect.Value) error {
 	kind := v.Kind()
 	val := (rand.Float32() * 180) - 90
@@ -42,6 +45,7 @@ func (i Address) Latitude(v reflect.Value) error {
 	return nil
 }
 
+// Longitude sets longitude of the address
 func (i Address) Longitude(v reflect.Value) error {
 	kind := v.Kind()
 	val := (rand.Float32() * 360) - 180
diff --git a/datetime.go b/datetime.go
index 4c03cd0..c02f53e 100644
--- a/datetime.go
+++ b/datetime.go
@@ -605,6 +605,7 @@ const (
 	TimePeriod = "PM"
 )
 
+// A DateTimer contains random Time generators, returning time string in certain particular format
 type DateTimer interface {
 	UnixTime(v reflect.Value) error
 	Date() string
@@ -621,6 +622,7 @@ type DateTimer interface {
 
 var date DateTimer
 
+// GetDateTimer returns a new DateTimer interface of DateTime
 func GetDateTimer() DateTimer {
 	mu.Lock()
 	defer mu.Unlock()
@@ -631,14 +633,16 @@ func GetDateTimer() DateTimer {
 	return date
 }
 
+// SetDateTimer sets custom date time
 func SetDateTimer(d DateTimer) {
 	date = d
 }
 
+// DateTime struct
 type DateTime struct {
 }
 
-// get unix time
+// UnixTime get unix time
 func (d DateTime) UnixTime(v reflect.Value) error {
 	kind := v.Kind()
 
@@ -650,47 +654,57 @@ func (d DateTime) UnixTime(v reflect.Value) error {
 	return nil
 }
 
-// format example BaseDate const
+// Date formats DateTime using example BaseDate const
 func (d DateTime) Date() string {
 	return time.Unix(RandomUnixTime(), 0).Format(BaseDate)
 }
 
+// Time formats DateTime using example Time const
 func (d DateTime) Time() string {
 	return time.Unix(RandomUnixTime(), 0).Format(Time)
 }
 
+// MonthName formats DateTime using example Month const
 func (d DateTime) MonthName() string {
 	return time.Unix(RandomUnixTime(), 0).Format(Month)
 }
 
+// Year formats DateTime using example Year const
 func (d DateTime) Year() string {
 	return time.Unix(RandomUnixTime(), 0).Format(Year)
 }
 
+// DayOfWeek formats DateTime using example Day const
 func (d DateTime) DayOfWeek() string {
 	return time.Unix(RandomUnixTime(), 0).Format(Day)
 }
+
+// DayOfMonth formats DateTime using example DayOfMonth const
 func (d DateTime) DayOfMonth() string {
 	return time.Unix(RandomUnixTime(), 0).Format(DayOfMonth)
 }
 
+// Timestamp formats DateTime using example Timestamp const
 func (d DateTime) Timestamp() string {
 	return time.Unix(RandomUnixTime(), 0).Format(fmt.Sprintf("%s %s", BaseDate, Time))
 }
 
+// Century returns a random century
 func (d DateTime) Century() string {
 	return randomElementFromSliceString(century)
 }
 
+// TimeZone returns a random timezone
 func (d DateTime) TimeZone() string {
 	return randomElementFromSliceString(timezones)
 }
 
+// TimePeriod formats DateTime using example TimePeriod const
 func (d DateTime) TimePeriod() string {
 	return time.Unix(RandomUnixTime(), 0).Format(TimePeriod)
 }
 
-// helper function
+// RandomUnixTime is a helper function returning random Unix time
 func RandomUnixTime() int64 {
 	return rand.Int63n(time.Now().Unix())
 }
diff --git a/faker.go b/faker.go
index 5b33236..3b4c47e 100644
--- a/faker.go
+++ b/faker.go
@@ -13,6 +13,7 @@ import (
 
 var mu = &sync.Mutex{}
 
+// Supported tags
 const (
 	letterIdxBits      = 6                    // 6 bits to represent a letter index
 	letterIdxMask      = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
@@ -23,38 +24,41 @@ const (
 	MacAddress         = "mac_address"
 	DomainName         = "domain_name"
 	UserName           = "username"
-	Url                = "url"
+	URL                = "url"
 	IPV4               = "ipv4"
 	IPV6               = "ipv6"
 	PASSWORD           = "password"
 	LATITUDE           = "lat"
 	LONGITUDE          = "long"
-	CREDIT_CARD_NUMBER = "cc_number"
-	CREDIT_CARD_TYPE   = "cc_type"
-	PHONE_NUMBER       = "phone_number"
-	TOLL_FREE_NUMBER   = "tool_free_number"
-	E164_PHONE_NUMBER  = "e_164_phone_number"
-	TITLE_MALE         = "title_male"
-	TITLE_FEMALE       = "title_female"
-	FIRST_NAME         = "first_name"
-	FIRST_NAME_MALE    = "first_name_male"
-	FIRST_NAME_FEMALE  = "first_name_female"
-	LAST_NAME          = "last_name"
+	CreditCardNumber   = "cc_number"
+	CreditCardType     = "cc_type"
+	PhoneNumber        = "phone_number"
+	TollFreeNumber     = "tool_free_number"
+	E164PhoneNumber    = "e_164_phone_number"
+	TitleMale          = "title_male"
+	TitleFemale        = "title_female"
+	FirstName          = "first_name"
+	FirstNameMale      = "first_name_male"
+	FirstNameFemale    = "first_name_female"
+	LastName           = "last_name"
 	NAME               = "name"
-	UNIX_TIME          = "unix_time"
+	UnixTime           = "unix_time"
 	DATE               = "date"
 	TIME               = "time"
-	MONTH_NAME         = "month_name"
+	MonthName          = "month_name"
 	YEAR               = "year"
-	DAY_OF_WEEK        = "day_of_week"
-	DAY_OF_MONTH       = "day_of_month"
+	DayOfWeek          = "day_of_week"
+	DayOfMonthTag      = "day_of_month"
 	TIMESTAMP          = "timestamp"
 	CENTURY            = "century"
 	TIMEZONE           = "timezone"
-	TIME_PERIOD        = "time_period"
+	TimePeriodTag      = "time_period"
 	WORD               = "word"
 	SENTENCE           = "sentence"
-	SENTENCES          = "sentences"
+	PARAGRAPH          = "paragraph"
+	Currency           = "currency"
+	Amount             = "amount"
+	AmountWithCurrency = "amount_with_currency"
 	SKIP               = "-"
 )
 
@@ -62,60 +66,61 @@ var mapperTag = map[string]interface{}{
 	Email:              GetNetworker().Email,
 	MacAddress:         GetNetworker().MacAddress,
 	DomainName:         GetNetworker().DomainName,
-	Url:                GetNetworker().Url,
+	URL:                GetNetworker().URL,
 	UserName:           GetNetworker().UserName,
-	IPV4:               GetNetworker().Ipv4,
-	IPV6:               GetNetworker().Ipv6,
+	IPV4:               GetNetworker().IPv4,
+	IPV6:               GetNetworker().IPv6,
 	PASSWORD:           GetNetworker().Password,
-	CREDIT_CARD_TYPE:   GetPayment().CreditCardType,
-	CREDIT_CARD_NUMBER: GetPayment().CreditCardNumber,
+	CreditCardType:     GetPayment().CreditCardType,
+	CreditCardNumber:   GetPayment().CreditCardNumber,
 	LATITUDE:           GetAddress().Latitude,
 	LONGITUDE:          GetAddress().Longitude,
-	PHONE_NUMBER:       GetPhoner().PhoneNumber,
-	TOLL_FREE_NUMBER:   GetPhoner().TollFreePhoneNumber,
-	E164_PHONE_NUMBER:  GetPhoner().E164PhoneNumber,
-	TITLE_MALE:         GetPerson().TitleMale,
-	TITLE_FEMALE:       GetPerson().TitleFeMale,
-	FIRST_NAME:         GetPerson().FirstName,
-	FIRST_NAME_MALE:    GetPerson().FirstNameMale,
-	FIRST_NAME_FEMALE:  GetPerson().FirstNameFemale,
-	LAST_NAME:          GetPerson().LastName,
+	PhoneNumber:        GetPhoner().PhoneNumber,
+	TollFreeNumber:     GetPhoner().TollFreePhoneNumber,
+	E164PhoneNumber:    GetPhoner().E164PhoneNumber,
+	TitleMale:          GetPerson().TitleMale,
+	TitleFemale:        GetPerson().TitleFeMale,
+	FirstName:          GetPerson().FirstName,
+	FirstNameMale:      GetPerson().FirstNameMale,
+	FirstNameFemale:    GetPerson().FirstNameFemale,
+	LastName:           GetPerson().LastName,
 	NAME:               GetPerson().Name,
-	UNIX_TIME:          GetDateTimer().UnixTime,
+	UnixTime:           GetDateTimer().UnixTime,
 	DATE:               GetDateTimer().Date,
 	TIME:               GetDateTimer().Time,
-	MONTH_NAME:         GetDateTimer().MonthName,
+	MonthName:          GetDateTimer().MonthName,
 	YEAR:               GetDateTimer().Year,
-	DAY_OF_WEEK:        GetDateTimer().DayOfWeek,
-	DAY_OF_MONTH:       GetDateTimer().DayOfMonth,
+	DayOfWeek:          GetDateTimer().DayOfWeek,
+	DayOfMonthTag:      GetDateTimer().DayOfMonth,
 	TIMESTAMP:          GetDateTimer().Timestamp,
 	CENTURY:            GetDateTimer().Century,
 	TIMEZONE:           GetDateTimer().TimeZone,
-	TIME_PERIOD:        GetDateTimer().TimePeriod,
+	TimePeriodTag:      GetDateTimer().TimePeriod,
 	WORD:               GetLorem().Word,
 	SENTENCE:           GetLorem().Sentence,
-	SENTENCES:          GetLorem().Sentences,
+	PARAGRAPH:          GetLorem().Paragraph,
+	Currency:           GetPrice().Currency,
+	Amount:             GetPrice().Amount,
+	AmountWithCurrency: GetPrice().AmountWithCurrency,
 }
 
-// Error when get fake from ptr
-var ErrUnsupportedKindPtr = "Unsupported kind: %s Change Without using * (pointer) in Field of %s"
-
-// Error when pass unsupported kind
-var ErrUnsupportedKind = "Unsupported kind: %s"
-
-// Error when value  is not pointer
-var ErrValueNotPtr = "Not a pointer value"
-
-// Error when tag not supported
-var ErrTagNotSupported = "Tag unsupported"
-
-// ErrTagAlreadyExists - error when tag exists and call AddProvider
-var ErrTagAlreadyExists = "Tag exists"
-
-// Error when passed more arguments
-var ErrMoreArguments = "Passed more arguments than is possible : (%d)"
-
-var ErrNotSupportedPointer = "Use sample:=new(%s)\n faker.FakeData(sample) instead"
+// Generic Error Messages for tags
+// 		ErrUnsupportedKindPtr: Error when get fake from ptr
+// 		ErrUnsupportedKind: Error on passing unsupported kind
+// 		ErrValueNotPtr: Error when value is not pointer
+// 		ErrTagNotSupported: Error when tag is not supported
+//		ErrTagAlreadyExists: Error when tag exists and call AddProvider
+// 		ErrMoreArguments: Error on passing more arguments
+// 		ErrNotSupportedPointer: Error when passing unsupported pointer
+var (
+	ErrUnsupportedKindPtr  = "Unsupported kind: %s Change Without using * (pointer) in Field of %s"
+	ErrUnsupportedKind     = "Unsupported kind: %s"
+	ErrValueNotPtr         = "Not a pointer value"
+	ErrTagNotSupported     = "Tag unsupported"
+	ErrTagAlreadyExists    = "Tag exists"
+	ErrMoreArguments       = "Passed more arguments than is possible : (%d)"
+	ErrNotSupportedPointer = "Use sample:=new(%s)\n faker.FakeData(sample) instead"
+)
 
 func init() {
 	rand.Seed(time.Now().UnixNano())
@@ -356,12 +361,10 @@ func randomStringNumber(n int) string {
 	return string(b)
 }
 
-/**
-/ Get three parameters , only first mandatory and the rest are optional
-/ --- If only set one parameter :  This means the minimum number of digits and the total number
-/ --- If only set two parameters : First this is min digit and second max digit and the total number the difference between them
-/ --- If only three parameters: the third argument set Max count Digit
-*/
+// RandomInt Get three parameters , only first mandatory and the rest are optional
+// 		If only set one parameter :  This means the minimum number of digits and the total number
+// 		If only set two parameters : First this is min digit and second max digit and the total number the difference between them
+// 		If only three parameters: the third argument set Max count Digit
 func RandomInt(parameters ...int) (p []int, err error) {
 	switch len(parameters) {
 	case 1:
diff --git a/internet.go b/internet.go
index db0e2a8..df521cc 100644
--- a/internet.go
+++ b/internet.go
@@ -10,19 +10,21 @@ import (
 var tld = []string{"com", "biz", "info", "net", "org", "ru"}
 var urlFormats = []string{
 	"http://www.%s/",
+	"https://www.%s/",
 	"http://%s/",
-	"http://www.%s/%s",
+	"https://%s/",
 	"http://www.%s/%s",
 	"https://www.%s/%s",
 	"http://%s/%s",
-	"http://%s/%s",
+	"https://%s/%s",
 	"http://%s/%s.html",
 	"https://%s/%s.html",
 	"http://%s/%s.php",
+	"https://%s/%s.php",
 }
 var internet Networker
 
-// Constructor
+// GetNetworker returns a new Networker interface of Internet
 func GetNetworker() Networker {
 	mu.Lock()
 	defer mu.Unlock()
@@ -33,51 +35,62 @@ func GetNetworker() Networker {
 	return internet
 }
 
-// this set custom Network
+// SetNetwork sets custom Network
 func SetNetwork(net Networker) {
 	internet = net
 }
 
+// Networker is logical layer for Internet
 type Networker interface {
 	Email() string
 	MacAddress() string
 	DomainName() string
-	Url() string
+	URL() string
 	UserName() string
-	Ipv4() string
-	Ipv6() string
+	IPv4() string
+	IPv6() string
 	Password() string
 }
 
+// Internet struct
 type Internet struct{}
 
+// Email generates random email id
 func (internet Internet) Email() string {
 	return randomString(7) + "@" + randomString(5) + "." + randomElementFromSliceString(tld)
 }
+
+// MacAddress generates random MacAddress
 func (internet Internet) MacAddress() string {
 	ip := make([]byte, 6)
 	for i := 0; i < 6; i++ {
 		ip[i] = byte(rand.Intn(256))
 	}
-
 	return net.HardwareAddr(ip).String()
 }
+
+// DomainName generates random domain name
 func (internet Internet) DomainName() string {
 	return randomString(7) + "." + randomElementFromSliceString(tld)
 }
-func (internet Internet) Url() string {
+
+// URL generates random URL standardised in urlFormats const
+func (internet Internet) URL() string {
 	format := randomElementFromSliceString(urlFormats)
 	countVerbs := strings.Count(format, "%s")
 	if countVerbs == 1 {
 		return fmt.Sprintf(format, internet.DomainName())
-	} else {
-		return fmt.Sprintf(format, internet.DomainName(), internet.UserName())
 	}
+	return fmt.Sprintf(format, internet.DomainName(), internet.UserName())
 }
+
+// UserName generates random username
 func (internet Internet) UserName() string {
 	return randomString(7)
 }
-func (internet Internet) Ipv4() string {
+
+// IPv4 generates random IPv4 address
+func (internet Internet) IPv4() string {
 	size := 4
 	ip := make([]byte, size)
 	for i := 0; i < size; i++ {
@@ -85,7 +98,9 @@ func (internet Internet) Ipv4() string {
 	}
 	return net.IP(ip).To4().String()
 }
-func (internet Internet) Ipv6() string {
+
+// IPv6 generates random IPv6 address
+func (internet Internet) IPv6() string {
 	size := 16
 	ip := make([]byte, size)
 	for i := 0; i < size; i++ {
@@ -94,7 +109,7 @@ func (internet Internet) Ipv6() string {
 	return net.IP(ip).To16().String()
 }
 
-// get hash password
+// Password returns a hashed password
 func (internet Internet) Password() string {
 	return randomString(50)
 }
diff --git a/lorem.go b/lorem.go
index cf31159..27ef5e5 100644
--- a/lorem.go
+++ b/lorem.go
@@ -2,11 +2,13 @@ package faker
 
 import (
 	"fmt"
+	"math/rand"
 	"strings"
 )
 
 var lorem DataFaker
-var wordList = []string{"alias", "consequatur", "aut", "perferendis", "sit", "voluptatem",
+var wordList = []string{
+	"alias", "consequatur", "aut", "perferendis", "sit", "voluptatem",
 	"accusantium", "doloremque", "aperiam", "eaque", "ipsa", "quae", "ab",
 	"illo", "inventore", "veritatis", "et", "quasi", "architecto",
 	"beatae", "vitae", "dicta", "sunt", "explicabo", "aspernatur", "aut",
@@ -42,19 +44,22 @@ var wordList = []string{"alias", "consequatur", "aut", "perferendis", "sit", "vo
 	"voluptates", "repudiandae", "sint", "et", "molestiae", "non",
 	"recusandae", "itaque", "earum", "rerum", "hic", "tenetur", "a",
 	"sapiente", "delectus", "ut", "aut", "reiciendis", "voluptatibus",
-	"maiores", "doloribus", "asperiores", "repellat"}
+	"maiores", "doloribus", "asperiores", "repellat",
+}
 
+// DataFaker generates randomized Words, Sentences and Paragraphs
 type DataFaker interface {
 	Word() string
 	Sentence() string
-	Sentences() string
+	Paragraph() string
 }
 
+// SetDataFaker sets Custom data in lorem
 func SetDataFaker(d DataFaker) {
 	lorem = d
 }
 
-// Constructor
+// GetLorem returns a new DataFaker interface of Lorem struct
 func GetLorem() DataFaker {
 	mu.Lock()
 	defer mu.Unlock()
@@ -65,27 +70,40 @@ func GetLorem() DataFaker {
 	return lorem
 }
 
+// Lorem struct
 type Lorem struct {
 }
 
+// Word returns a word from the wordList const
 func (l Lorem) Word() string {
 	return randomElementFromSliceString(wordList)
 }
+
+// Sentence returns a sentence using the wordList const
 func (l Lorem) Sentence() (sentence string) {
 	r, _ := RandomInt(1, 6)
+	size := len(r)
 	for key, val := range r {
 		if key == 0 {
-			sentence += strings.Title(wordList[val] + " ")
+			sentence += strings.Title(wordList[val])
 		} else {
-			sentence += wordList[val] + " "
+			sentence += wordList[val]
+		}
+		if key != size-1 {
+			sentence += " "
 		}
 	}
 	return fmt.Sprintf("%s.", sentence)
 }
 
-func (l Lorem) Sentences() (sentences string) {
-	for i := 0; i < 3; i++ {
-		sentences += l.Sentence()
+// Paragraph returns a series of sentences as a paragraph using the wordList const
+func (l Lorem) Paragraph() (paragraph string) {
+	size := rand.Intn(10) + 1
+	for i := 0; i < size; i++ {
+		paragraph += l.Sentence()
+		if i != size-1 {
+			paragraph += " "
+		}
 	}
-	return sentences
+	return paragraph
 }
diff --git a/payment.go b/payment.go
index 6d585bf..31b73e4 100644
--- a/payment.go
+++ b/payment.go
@@ -10,6 +10,7 @@ const (
 	numberBytes = "0123456789"
 )
 
+// creditCard struct
 type creditCard struct {
 	ccType   string
 	length   int
@@ -25,11 +26,9 @@ var creditCards = map[string]creditCard{
 
 var pay Render
 
-// CreditCardType returns one of the following credit values:
-// VISA, MasterCard, American Express and Discover
 var cacheCreditCard string
 
-// Constructor
+// GetPayment returns a new Render interface of Payment struct
 func GetPayment() Render {
 	mu.Lock()
 	defer mu.Unlock()
@@ -40,18 +39,22 @@ func GetPayment() Render {
 	return pay
 }
 
-// this set custom Network
+// SetPayment set custom Network
 func SetPayment(p Render) {
 	pay = p
 }
 
+// Render contains Whole Random Credit Card Generators with their types
 type Render interface {
 	CreditCardType() string
 	CreditCardNumber() string
 }
 
+// Payment struct
 type Payment struct{}
 
+// CreditCardType returns one of the following credit values:
+// VISA, MasterCard, American Express and Discover
 func (p Payment) CreditCardType() string {
 	n := len(creditCards)
 	if cacheCreditCard != "" {
@@ -66,7 +69,7 @@ func (p Payment) CreditCardType() string {
 	return cacheCreditCard
 }
 
-// CreditCardNum generated credit card number according to the card number rules
+// CreditCardNumber generated credit card number according to the card number rules
 func (p Payment) CreditCardNumber() string {
 	ccType := strings.ToLower(p.CreditCardType())
 	cacheCreditCard = ccType
@@ -79,5 +82,3 @@ func (p Payment) CreditCardNumber() string {
 	num += digit
 	return num
 }
-
-
diff --git a/person.go b/person.go
index 6ef1a70..e7fe80a 100644
--- a/person.go
+++ b/person.go
@@ -5,6 +5,7 @@ import (
 	"math/rand"
 )
 
+// Dowser provides interfaces to generate random logical Names with their initials
 type Dowser interface {
 	TitleMale() string
 	TitleFeMale() string
@@ -17,10 +18,10 @@ type Dowser interface {
 
 var person Dowser
 var titlesMale = []string{
-	"Mr.", "Dr.", "Prof.",
+	"Mr.", "Dr.", "Prof.", "Lord", "King", "Prince",
 }
 var titlesFemale = []string{
-	"Mrs.", "Ms.", "Miss", "Dr.", "Prof.",
+	"Mrs.", "Ms.", "Miss", "Dr.", "Prof.", "Lady", "Queen", "Princess",
 }
 var firstNamesMale = []string{
 	"Aaron", "Abdiel", "Abdul", "Abdullah", "Abe", "Abel", "Abelardo", "Abner", "Abraham", "Adalberto", "Adam", "Adan", "Adelbert", "Adolf", "Adolfo", "Adolph", "Adolphus", "Adonis", "Adrain", "Adrian", "Adriel", "Adrien", "Afton", "Agustin", "Ahmad", "Ahmed", "Aidan", "Aiden", "Akeem", "Al", "Alan", "Albert", "Alberto", "Albin", "Alden", "Alec", "Alejandrin", "Alek", "Alessandro", "Alex", "Alexander", "Alexandre", "Alexandro", "Alexie", "Alexis", "Alexys", "Alexzander", "Alf", "Alfonso", "Alfonzo", "Alford", "Alfred", "Alfredo", "Ali", "Allan", "Allen", "Alphonso", "Alvah", "Alvis", "Amani", "Amari", "Ambrose", "Americo", "Amir", "Amos", "Amparo", "Anastacio", "Anderson", "Andre", "Andres", "Andrew", "Andy", "Angel", "Angelo", "Angus", "Anibal", "Ansel", "Ansley", "Anthony", "Antone", "Antonio", "Antwan", "Antwon", "Arch", "Archibald", "Arden", "Arely", "Ari", "Aric", "Ariel", "Arjun", "Arlo", "Armand", "Armando", "Armani", "Arnaldo", "Arne", "Arno", "Arnold", "Arnoldo", "Arnulfo", "Aron", "Art", "Arthur", "Arturo", "Arvel", "Arvid", "Ashton", "August", "Augustus", "Aurelio", "Austen", "Austin", "Austyn", "Avery", "Axel", "Ayden",
@@ -47,6 +48,7 @@ var firstNamesMale = []string{
 	"Valentin", "Van", "Vance", "Vaughn", "Vern", "Verner", "Vernon", "Vicente", "Victor", "Vidal", "Vince", "Vincent", "Vincenzo", "Vinnie", "Virgil", "Vito", "Vladimir",
 	"Wade", "Waino", "Waldo", "Walker", "Wallace", "Walter", "Walton", "Ward", "Warren", "Watson", "Waylon", "Wayne", "Webster", "Weldon", "Wellington", "Wendell", "Werner", "Westley", "Weston", "Wilber", "Wilbert", "Wilburn", "Wiley", "Wilford", "Wilfred", "Wilfredo", "Wilfrid", "Wilhelm", "Will", "Willard", "William", "Willis", "Willy", "Wilmer", "Wilson", "Wilton", "Winfield", "Winston", "Woodrow", "Wyatt", "Wyman",
 	"Xavier", "Xzavier", "Xander",
+	"Yadav", "Yogesh", "Yaatiesh", "Yaamir",
 	"Zachariah", "Zachary", "Zachery", "Zack", "Zackary", "Zackery", "Zakary", "Zander", "Zane", "Zechariah", "Zion",
 }
 var firstNamesFemale = []string{
@@ -73,6 +75,7 @@ var firstNamesFemale = []string{
 	"Una", "Ursula",
 	"Vada", "Valentina", "Valentine", "Valerie", "Vallie", "Vanessa", "Veda", "Velda", "Vella", "Velma", "Velva", "Vena", "Verda", "Verdie", "Vergie", "Verla", "Verlie", "Verna", "Vernice", "Vernie", "Verona", "Veronica", "Vesta", "Vicenta", "Vickie", "Vicky", "Victoria", "Vida", "Vilma", "Vincenza", "Viola", "Violet", "Violette", "Virgie", "Virginia", "Virginie", "Vita", "Viva", "Vivian", "Viviane", "Vivianne", "Vivien", "Vivienne",
 	"Wanda", "Wava", "Wendy", "Whitney", "Wilhelmine", "Willa", "Willie", "Willow", "Wilma", "Winifred", "Winnifred", "Winona",
+	"Xiu-Mei", "Xio",
 	"Yadira", "Yasmeen", "Yasmin", "Yasmine", "Yazmin", "Yesenia", "Yessenia", "Yolanda", "Yoshiko", "Yvette", "Yvonne",
 	"Zaria", "Zelda", "Zella", "Zelma", "Zena", "Zetta", "Zita", "Zoe", "Zoey", "Zoie", "Zoila", "Zola", "Zora", "Zula",
 }
@@ -104,6 +107,7 @@ var lastNames = []string{
 }
 var randNameFlag = rand.Intn(100)
 
+// GetPerson returns a new Dowser interface of Person struct
 func GetPerson() Dowser {
 	mu.Lock()
 	defer mu.Unlock()
@@ -114,42 +118,49 @@ func GetPerson() Dowser {
 	return person
 }
 
-// this set custom Address
+// SetDowser sets custom Dowsers of Person names
 func SetDowser(d Dowser) {
 	person = d
 }
 
+// Person struct
 type Person struct {
 }
 
+// TitleMale generates random titles for males
 func (p Person) TitleMale() string {
 	return randomElementFromSliceString(titlesMale)
 }
 
+// TitleFeMale generates random titles for females
 func (p Person) TitleFeMale() string {
 	return randomElementFromSliceString(titlesFemale)
 }
 
+// FirstName retuns first names
 func (p Person) FirstName() string {
 	return randomElementFromSliceString(firstNames)
 }
 
+// FirstNameMale retuns first names for males
 func (p Person) FirstNameMale() string {
 	return randomElementFromSliceString(firstNamesMale)
 }
 
+// FirstNameFemale retuns first names for females
 func (p Person) FirstNameFemale() string {
 	return randomElementFromSliceString(firstNamesFemale)
 }
 
+// LastName returns last name
 func (p Person) LastName() string {
 	return randomElementFromSliceString(lastNames)
 }
 
+// Name returns a random name
 func (p Person) Name() string {
 	if randNameFlag > 50 {
 		return fmt.Sprintf("%s %s %s", randomElementFromSliceString(titlesFemale), randomElementFromSliceString(firstNamesFemale), randomElementFromSliceString(lastNames))
-	} else {
-		return fmt.Sprintf("%s %s %s", randomElementFromSliceString(titlesMale), randomElementFromSliceString(firstNamesMale), randomElementFromSliceString(lastNames))
 	}
+	return fmt.Sprintf("%s %s %s", randomElementFromSliceString(titlesMale), randomElementFromSliceString(firstNamesMale), randomElementFromSliceString(lastNames))
 }
diff --git a/phone.go b/phone.go
index 158ebf1..1e68ad6 100644
--- a/phone.go
+++ b/phone.go
@@ -10,7 +10,7 @@ import (
 
 var phone Phoner
 
-// Constructor
+// GetPhoner serves as a constructor for Phoner interface
 func GetPhoner() Phoner {
 	mu.Lock()
 	defer mu.Unlock()
@@ -21,33 +21,36 @@ func GetPhoner() Phoner {
 	return phone
 }
 
-// this set custom Phoner
+// SetPhoner sets custom Phoner
 func SetPhoner(p Phoner) {
 	phone = p
 }
 
+// Phoner serves overall tele-phonic contact generator
 type Phoner interface {
 	PhoneNumber() string
 	TollFreePhoneNumber() string
 	E164PhoneNumber() string
 }
 
-type Phone struct{}
+// Phone struct
+type Phone struct {
+}
 
-// 201-886-0269
+// PhoneNumber generates phone numbers of type: "201-886-0269"
 func (p Phone) PhoneNumber() string {
 	randInt, _ := RandomInt(1, 10)
-	str := strings.Join(slice.SliceIntToString(randInt), "")
+	str := strings.Join(slice.IntToString(randInt), "")
 	return fmt.Sprintf("%s-%s-%s", str[:3], str[3:6], str[6:10])
 }
 
-// example : (888) 937-7238
+// TollFreePhoneNumber generates phone numbers of type: "(888) 937-7238"
 func (p Phone) TollFreePhoneNumber() string {
 	out := ""
 	boxDigitsStart := []string{"777", "888"}
 
 	ints, _ := RandomInt(1, 9)
-	for index, v := range slice.SliceIntToString(ints) {
+	for index, v := range slice.IntToString(ints) {
 		if index == 3 {
 			out += "-"
 		}
@@ -56,14 +59,14 @@ func (p Phone) TollFreePhoneNumber() string {
 	return fmt.Sprintf("(%s) %s", boxDigitsStart[rand.Intn(1)], out)
 }
 
-// '+27113456789'
+// E164PhoneNumber generates phone numbers of type: "+27113456789"
 func (p Phone) E164PhoneNumber() string {
 	out := ""
 	boxDigitsStart := []string{"7", "8"}
 	ints, _ := RandomInt(1, 10)
 
-	for _, v := range slice.SliceIntToString(ints) {
+	for _, v := range slice.IntToString(ints) {
 		out += string(v)
 	}
-	return fmt.Sprintf("+%s%s", boxDigitsStart[rand.Intn(1)], strings.Join(slice.SliceIntToString(ints), ""))
+	return fmt.Sprintf("+%s%s", boxDigitsStart[rand.Intn(1)], strings.Join(slice.IntToString(ints), ""))
 }
diff --git a/price.go b/price.go
new file mode 100644
index 0000000..5ae3363
--- /dev/null
+++ b/price.go
@@ -0,0 +1,91 @@
+package faker
+
+import (
+	"fmt"
+	"math"
+	"math/rand"
+	"reflect"
+)
+
+// Currency Codes | Source: https://en.wikipedia.org/wiki/ISO_4217
+var currencies = []string{
+	"AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG",
+	"AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND",
+	"BOB", "BOV", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD", "CAD",
+	"CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "CNY", "COP", "COU",
+	"CRC", "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD",
+	"EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GHS",
+	"GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG",
+	"HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD",
+	"JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD",
+	"KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", "MAD", "MDL",
+	"MGA", "MKD", "MMK", "MNT", "MOP", "MRU", "MUR", "MVR", "MWK",
+	"MXN", "MXV", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR",
+	"NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG",
+	"QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG",
+	"SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STN", "SVC",
+	"SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD",
+	"TWD", "TZS", "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UYW",
+	"UZS", "VES", "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA",
+	"XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT",
+	"XSU", "XTS", "XUA", "XXX", "YER", "ZAR", "ZMW", "ZWL",
+}
+
+// Money provides an interface to generate a custom price with or without a random currency code
+type Money interface {
+	Currency() string
+	Amount(v reflect.Value) error
+	AmountWithCurrency() string
+}
+
+// Price struct
+type Price struct {
+}
+
+var pri Money
+
+// GetPrice returns a new Money interface of Price struct
+func GetPrice() Money {
+	mu.Lock()
+	defer mu.Unlock()
+
+	if pri == nil {
+		pri = &Price{}
+	}
+	return pri
+}
+
+// SetPrice sets custom Money
+func SetPrice(p Money) {
+	pri = p
+}
+
+// Currency returns a random currency from currencies
+func (p Price) Currency() string {
+	return randomElementFromSliceString(currencies)
+}
+
+// Amount returns a random floating price amount
+// with a random precision of [1,2] up to (10**8 - 1)
+func (p Price) Amount(v reflect.Value) error {
+	kind := v.Kind()
+	val := precision(rand.Float64()*math.Pow10(rand.Intn(8)), rand.Intn(2)+1)
+	if kind == reflect.Float32 {
+		v.Set(reflect.ValueOf(float32(val)))
+		return nil
+	}
+	v.Set(reflect.ValueOf(val))
+	return nil
+}
+
+// AmountWithCurrency combines both price and currency together
+func (p Price) AmountWithCurrency() string {
+	val := precision(rand.Float64()*math.Pow10(rand.Intn(8)), rand.Intn(2)+1)
+	return fmt.Sprintf("%s %f", p.Currency(), val)
+}
+
+// precision | a helper function to set precision of price
+func precision(val float64, pre int) float64 {
+	div := math.Pow10(pre)
+	return float64(int64(val*div)) / div
+}
diff --git a/support/slice/helpers.go b/support/slice/helpers.go
index 1e24345..ab21e96 100644
--- a/support/slice/helpers.go
+++ b/support/slice/helpers.go
@@ -4,7 +4,7 @@ import (
 	"strconv"
 )
 
-// Check item in slice string type
+// Contains Check item in slice string type
 func Contains(slice []string, item string) bool {
 	set := make(map[string]struct{}, len(slice))
 	for _, s := range slice {
@@ -15,8 +15,8 @@ func Contains(slice []string, item string) bool {
 	return ok
 }
 
-// Convert slice int to slice string
-func SliceIntToString(intSl []int) (str []string) {
+// IntToString Convert slice int to slice string
+func IntToString(intSl []int) (str []string) {
 	for i := range intSl {
 		number := intSl[i]
 		text := strconv.Itoa(number)


Test patch:
diff --git a/faker_test.go b/faker_test.go
index 5a6f796..bd58d5f 100644
--- a/faker_test.go
+++ b/faker_test.go
@@ -23,29 +23,32 @@ type SomeStruct struct {
 	UInt32 uint32
 	UInt64 uint64
 
-	Latitude         float32 `faker:"lat"`
-	LATITUDE         float64 `faker:"lat"`
-	Long             float32 `faker:"long"`
-	LONG             float64 `faker:"long"`
-	String           string
-	CreditCardType   string `faker:"cc_type"`
-	CreditCardNumber string `faker:"cc_number"`
-	Email            string `faker:"email"`
-	IPV4             string `faker:"ipv4"`
-	IPV6             string `faker:"ipv6"`
-	Bool             bool
-	SString          []string
-	SInt             []int
-	SInt8            []int8
-	SInt16           []int16
-	SInt32           []int32
-	SInt64           []int64
-	SFloat32         []float32
-	SFloat64         []float64
-	SBool            []bool
-	Struct           AStruct
-	Time             time.Time
-	Stime            []time.Time
+	Latitude           float32 `faker:"lat"`
+	LATITUDE           float64 `faker:"lat"`
+	Long               float32 `faker:"long"`
+	LONG               float64 `faker:"long"`
+	String             string
+	CreditCardType     string `faker:"cc_type"`
+	CreditCardNumber   string `faker:"cc_number"`
+	Email              string `faker:"email"`
+	IPV4               string `faker:"ipv4"`
+	IPV6               string `faker:"ipv6"`
+	Bool               bool
+	SString            []string
+	SInt               []int
+	SInt8              []int8
+	SInt16             []int16
+	SInt32             []int32
+	SInt64             []int64
+	SFloat32           []float32
+	SFloat64           []float64
+	SBool              []bool
+	Struct             AStruct
+	Time               time.Time
+	Stime              []time.Time
+	Currency           string  `faker:"currency"`
+	Amount             float64 `faker:"amount"`
+	AmountWithCurrency string  `faker:"amount_with_currency"`
 
 	MapStringString        map[string]string
 	MapStringStruct        map[string]AStruct
@@ -66,41 +69,44 @@ type CStruct struct {
 }
 
 type TaggedStruct struct {
-	Latitude         float32 `faker:"lat"`
-	Long             float32 `faker:"long"`
-	CreditCardNumber string  `faker:"cc_number"`
-	CreditCardType   string  `faker:"cc_type"`
-	Email            string  `faker:"email"`
-	IPV4             string  `faker:"ipv4"`
-	IPV6             string  `faker:"ipv6"`
-	Password         string  `faker:"password"`
-	PhoneNumber      string  `faker:"phone_number"`
-	MacAddress       string  `faker:"mac_address"`
-	Url              string  `faker:"url"`
-	UserName         string  `faker:"username"`
-	ToolFreeNumber   string  `faker:"tool_free_number"`
-	E164PhoneNumber  string  `faker:"e_164_phone_number"`
-	TitleMale        string  `faker:"title_male"`
-	TitleFemale      string  `faker:"title_female"`
-	FirstName        string  `faker:"first_name"`
-	FirstNameMale    string  `faker:"first_name_male"`
-	FirstNameFemale  string  `faker:"first_name_female"`
-	LastName         string  `faker:"last_name"`
-	Name             string  `faker:"name"`
-	UnixTime         int64   `faker:"unix_time"`
-	Date             string  `faker:"date"`
-	Time             string  `faker:"time"`
-	MonthName        string  `faker:"month_name"`
-	Year             string  `faker:"year"`
-	DayOfWeek        string  `faker:"day_of_week"`
-	DayOfMonth       string  `faker:"day_of_month"`
-	Timestamp        string  `faker:"timestamp"`
-	Century          string  `faker:"century"`
-	TimeZone         string  `faker:"timezone"`
-	TimePeriod       string  `faker:"time_period"`
-	Word             string  `faker:"word"`
-	Sentence         string  `faker:"sentence"`
-	Sentences        string  `faker:"sentences"`
+	Latitude           float32 `faker:"lat"`
+	Longitude          float32 `faker:"long"`
+	CreditCardNumber   string  `faker:"cc_number"`
+	CreditCardType     string  `faker:"cc_type"`
+	Email              string  `faker:"email"`
+	IPV4               string  `faker:"ipv4"`
+	IPV6               string  `faker:"ipv6"`
+	Password           string  `faker:"password"`
+	PhoneNumber        string  `faker:"phone_number"`
+	MacAddress         string  `faker:"mac_address"`
+	URL                string  `faker:"url"`
+	UserName           string  `faker:"username"`
+	ToolFreeNumber     string  `faker:"tool_free_number"`
+	E164PhoneNumber    string  `faker:"e_164_phone_number"`
+	TitleMale          string  `faker:"title_male"`
+	TitleFemale        string  `faker:"title_female"`
+	FirstName          string  `faker:"first_name"`
+	FirstNameMale      string  `faker:"first_name_male"`
+	FirstNameFemale    string  `faker:"first_name_female"`
+	LastName           string  `faker:"last_name"`
+	Name               string  `faker:"name"`
+	UnixTime           int64   `faker:"unix_time"`
+	Date               string  `faker:"date"`
+	Time               string  `faker:"time"`
+	MonthName          string  `faker:"month_name"`
+	Year               string  `faker:"year"`
+	DayOfWeek          string  `faker:"day_of_week"`
+	DayOfMonth         string  `faker:"day_of_month"`
+	Timestamp          string  `faker:"timestamp"`
+	Century            string  `faker:"century"`
+	TimeZone           string  `faker:"timezone"`
+	TimePeriod         string  `faker:"time_period"`
+	Word               string  `faker:"word"`
+	Sentence           string  `faker:"sentence"`
+	Paragraph          string  `faker:"paragraph"`
+	Currency           string  `faker:"currency"`
+	Amount             float32 `faker:"amount"`
+	AmountWithCurrency string  `faker:"amount_with_currency"`
 }
 
 func (t TaggedStruct) String() string {
@@ -115,7 +121,7 @@ func (t TaggedStruct) String() string {
 	Password: %s,
 	PhoneNumber: %s,
 	MacAddress: %s,
-	Url: %s,
+	URL: %s,
 	UserName: %s,
 	ToolFreeNumber: %s,
 	E164PhoneNumber: %s,
@@ -139,17 +145,21 @@ func (t TaggedStruct) String() string {
 	TimePeriod: %s,
 	Word: %s,
 	Sentence: %s,
-	Sentences: %s,
-}`, t.Latitude, t.Long, t.CreditCardNumber,
+	Paragraph: %s,
+	Currency: %s,
+	Amount: %f,
+	AmountWithCurrency: %s,
+}`, t.Latitude, t.Longitude, t.CreditCardNumber,
 		t.CreditCardType, t.Email, t.IPV4,
 		t.IPV6, t.Password, t.PhoneNumber, t.MacAddress,
-		t.Url, t.UserName, t.ToolFreeNumber,
+		t.URL, t.UserName, t.ToolFreeNumber,
 		t.E164PhoneNumber, t.TitleMale, t.TitleFemale,
 		t.FirstName, t.FirstNameMale, t.FirstNameFemale, t.LastName,
 		t.Name, t.UnixTime, t.Date,
 		t.Time, t.MonthName, t.Year, t.DayOfWeek,
 		t.DayOfMonth, t.Timestamp, t.Century, t.TimeZone,
-		t.TimePeriod, t.Word, t.Sentence, t.Sentences,
+		t.TimePeriod, t.Word, t.Sentence, t.Paragraph,
+		t.Currency, t.Amount, t.AmountWithCurrency,
 	)
 }
 
@@ -388,6 +398,7 @@ func TestSkipField(t *testing.T) {
 	if a.ShouldBeSkipped != 0 {
 		t.Error("Expected that field will be skipped")
 	}
+
 }
 
 func TestExtend(t *testing.T) {
diff --git a/internet_test.go b/internet_test.go
index cb814a9..ca12193 100644
--- a/internet_test.go
+++ b/internet_test.go
@@ -1,9 +1,10 @@
 package faker
 
 import (
-	"github.com/bxcodec/faker/support/slice"
 	"strings"
 	"testing"
+
+	"github.com/bxcodec/faker/support/slice"
 )
 
 func TestEmail(t *testing.T) {
@@ -25,19 +26,19 @@ func TestDomainName(t *testing.T) {
 		t.Error("Expected get DomainName")
 	}
 }
-func TestUrlOneVerbs(t *testing.T) {
+func TestURLOneVerbs(t *testing.T) {
 	urlFormats = []string{
 		"http://www.%s/"}
 
-	if !strings.Contains(GetNetworker().Url(), "http") {
+	if !strings.Contains(GetNetworker().URL(), "http") {
 		t.Error("Expected get url")
 	}
 }
-func TestUrlTwoVerbs(t *testing.T) {
+func TestURLTwoVerbs(t *testing.T) {
 	urlFormats = []string{
 		"http://www.%s/%s"}
 
-	if !strings.Contains(GetNetworker().Url(), "http") {
+	if !strings.Contains(GetNetworker().URL(), "http") {
 		t.Error("Expected get url")
 	}
 }
@@ -47,14 +48,14 @@ func TestUserName(t *testing.T) {
 	}
 
 }
-func TestIpv4(t *testing.T) {
-	if strings.Count(GetNetworker().Ipv4(), ".") != 3 {
-		t.Error("Expected Ipv4 format")
+func TestIPv4(t *testing.T) {
+	if strings.Count(GetNetworker().IPv4(), ".") != 3 {
+		t.Error("Expected IPv4 format")
 	}
 }
-func TestIpv6(t *testing.T) {
-	if strings.Count(GetNetworker().Ipv6(), ":") != 7 {
-		t.Error("Expected Ipv4 format")
+func TestIPv6(t *testing.T) {
+	if strings.Count(GetNetworker().IPv6(), ":") != 7 {
+		t.Error("Expected IPv4 format")
 	}
 }
 func TestSetNetwork(t *testing.T) {
diff --git a/lorem_test.go b/lorem_test.go
index 31d54ff..91c5555 100644
--- a/lorem_test.go
+++ b/lorem_test.go
@@ -1,9 +1,10 @@
 package faker
 
 import (
-	"github.com/bxcodec/faker/support/slice"
 	"strings"
 	"testing"
+
+	"github.com/bxcodec/faker/support/slice"
 )
 
 func TestDataFaker(t *testing.T) {
@@ -23,9 +24,9 @@ func TestSentence(t *testing.T) {
 	}
 }
 
-func TestSentences(t *testing.T) {
-	s := GetLorem().Sentences()
+func TestParagraph(t *testing.T) {
+	s := GetLorem().Paragraph()
 	if s == "" || !strings.HasSuffix(s, ".") {
-		t.Error("Expected sentences")
+		t.Error("Expected paragraph")
 	}
 }
diff --git a/payment_test.go b/payment_test.go
index f560fee..25c75c0 100644
--- a/payment_test.go
+++ b/payment_test.go
@@ -16,6 +16,6 @@ func TestCreditCardNumber(t *testing.T) {
 	GetPayment().CreditCardNumber()
 }
 
-func TestSetPayment(t *testing.T)  {
+func TestSetPayment(t *testing.T) {
 	SetPayment(Payment{})
-}
\ No newline at end of file
+}
diff --git a/price_test.go b/price_test.go
new file mode 100644
index 0000000..6ea5391
--- /dev/null
+++ b/price_test.go
@@ -0,0 +1,29 @@
+package faker
+
+import (
+	"fmt"
+	"strings"
+	"testing"
+
+	"github.com/bxcodec/faker/support/slice"
+)
+
+func TestSetPrice(t *testing.T) {
+	SetPrice(Price{})
+}
+
+func TestCurrency(t *testing.T) {
+	p := GetPrice()
+	fmt.Println(p.Currency())
+	if !slice.Contains(currencies, p.Currency()) {
+		t.Error("Expected a currency code from currencies")
+	}
+}
+
+func TestAmountWithCurrency(t *testing.T) {
+	p := GetPrice()
+	fmt.Println(p.AmountWithCurrency())
+	if !strings.Contains(p.AmountWithCurrency(), " ") {
+		t.Error("Expected Price currency followed by a space and it's ammount")
+	}
+}