Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Copyright Date in Roman Numerals


Obewanz

Recommended Posts

Posted

Well, I finally get to contribute something - even if it is small. :lol:

 

I actually got sidetracked on this while working on changing the reviewer name to display only the first name, last initial instead of the whole name.

 

Anyway, this will convert your copyright date at the footer of your site to Roman Numerals...

 

In /catalog/includes/languages/english.php (and any other language files you want the change to appear in.);

CHANGE LINE:

define('FOOTER_TEXT_BODY', 'Copyright © 2003 <a href="http://www.oscommerce.com" target="_blank">osCommerce</a><br>Powered by <a href="http://www.oscommerce.com" target="_blank">osCommerce</a>');



TO:

define('FOOTER_TEXT_BODY', 'Copyright © %s <a href="http://www.oscommerce.com" target="_blank">osCommerce</a><br>Powered by <a href="http://www.oscommerce.com" target="_blank">osCommerce</a>');

 

Paste the following code near or at the bottom of your /catalog/includes/functions/general.php file;

////

// Decimal <--> Roman 1.2 (osCommerce)

/************************************************

Written by: Rasmus Rimestad 

Written: XXIV.VII.MMI

Modified for osCommerce by: Steve Myers

Modified: XIV.VI.MMIII



This file includes three functions



string dec2roman (integer $number)

where $number is a number you want to convert to a roman one.



integer roman2dec (string $linje)

where $linje is the roman number you want to conver to an integer.



function roman_array_search($searchString, $array)

where $array is the roman numeral being evaluated - only used internally.

************************************************/



function dec2roman($number) {



# Making input compatible with script.

$number = floor($number);

if($number < 0) {

 $linje = "-";

 $number = abs($number);

}



# Defining arrays

$romanNumbers = array(1000, 500, 100, 50, 10, 5, 1);

$romanLettersToNumbers = array("M" => 1000, "D" => 500, "C" => 100, "L" => 50, "X" => 10, "V" => 5, "I" => 1);

$romanLetters = array_keys($romanLettersToNumbers);



# Looping through and adding letters.

while ($number) {

 for($pos = 0; $pos <= 6; $pos++) {

	 

	 # Dividing the remaining number with one of the roman numbers.

	 $dividend = $number / $romanNumbers[$pos];



	 # If that division is >= 1, round down, and add that number of letters to the string.

	 if($dividend >= 1) {

   $linje .= str_repeat($romanLetters[$pos], floor($dividend));



   # Reduce the number to reflect what is left to make roman of.

   $number -= floor($dividend) * $romanNumbers[$pos];

	 }

 }

}





# If I find 4 instances of the same letter, this should be done in a different way.

# Then, subtract instead of adding (smaller number in front of larger).

$numberOfChanges = 1;

while($numberOfChanges) {

 $numberOfChanges = 0;



 for($start = 0; $start < strlen($linje); $start++) {

	 $chunk = substr($linje, $start, 1);

	 if($chunk == $oldChunk && $chunk != "M") {

   $appearance++;

	 } else {

   $oldChunk = $chunk;

   $appearance = 1;

	 }



	 # Was there found 4 instances.

	 if($appearance == 4) {

   $firstLetter = substr($linje, $start - 4, 1);

   $letter = $chunk;

   $sum = $firstNumber + $letterNumber * 4;



   $pos = roman_array_search($letter, $romanLetters);



   # Are the four digits to be calculated together with the one before? (Example yes: VIIII = IX Example no: MIIII = MIV

   # This is found by checking if the digit before the first of the four instances is the one which is before the digits in the order

   # of the roman number. I.e. MDCLXVI.



   if($romanLetters[$pos - 1] == $firstLetter) {

  	 $oldString = $firstLetter . str_repeat($letter, 4);

  	 $newString = $letter . $romanLetters[$pos - 2];

   } else {

  	 $oldString = str_repeat($letter, 4);

  	 $newString = $letter . $romanLetters[$pos - 1];

   }

   $numberOfChanges++;

   $linje = str_replace($oldString, $newString, $linje);

	 

	 }



 }



}

return $linje;

}



function roman2dec($linje) {

# Fixing variable so it follows my convention

$linje = strtoupper($linje);



# Removing all not-roman letters

$linje = ereg_replace("[^IVXLCDM]", "", $linje);



print("$linje	= $linje<br>");



# Defining variables

$romanLettersToNumbers = array("M" => 1000, "D" => 500, "C" => 100, "L" => 50, "X" => 10, "V" => 5, "I" => 1);



$oldChunk = 1001;



# Looping through line

for($start = 0; $start < strlen($linje); $start++) {

 $chunk = substr($linje, $start, 1);

 

 $chunk = $romanLettersToNumbers[$chunk];

 

 if($chunk <= $oldChunk) {

	 $calculation .= " + $chunk";

 } else {

	 $calculation .= " + " . ($chunk - (2 * $oldChunk));

 }

 



 $oldChunk = $chunk;

}



# Summing it up

eval("$calculation = $calculation;");

return $calculation;



}



# Implementation of the roman_array_search function. Works only with numerical arrays.

function roman_array_search($searchString, $array) {

foreach ($array as $content) {

 if($content == $searchString) {

	 return $pos;

 }

 $pos++;

}

}

 

And finally in /catalog/includes/languages/footer.php;

CHANGE LINE:

 echo FOOTER_TEXT_BODY



TO:

 echo sprintf(FOOTER_TEXT_BODY, dec2roman(date('Y')));

 

Personally, I think it adds a "touch of class" to a website since most everybody displays the copyright date the same way.

 

Enjoy!! 8)

 

Obewanz

The GraphicZoo

check profile for web address

Posted

:D Great Tip. :D

I put the code in and it worked right off.

I like being different anyway. 8)

Posted
I actually got sidetracked on this while working on changing the reviewer name to display only the first name, last initial instead of the whole name.

 

Where can I find this?

  • 4 years later...

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...